| /******/ (function(modules) { // webpackBootstrap |
| /******/ // install a JSONP callback for chunk loading |
| /******/ function webpackJsonpCallback(data) { |
| /******/ var chunkIds = data[0]; |
| /******/ var moreModules = data[1]; |
| /******/ var executeModules = data[2]; |
| /******/ |
| /******/ // add "moreModules" to the modules object, |
| /******/ // then flag all "chunkIds" as loaded and fire callback |
| /******/ var moduleId, chunkId, i = 0, resolves = []; |
| /******/ for(;i < chunkIds.length; i++) { |
| /******/ chunkId = chunkIds[i]; |
| /******/ if(installedChunks[chunkId]) { |
| /******/ resolves.push(installedChunks[chunkId][0]); |
| /******/ } |
| /******/ installedChunks[chunkId] = 0; |
| /******/ } |
| /******/ for(moduleId in moreModules) { |
| /******/ if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) { |
| /******/ modules[moduleId] = moreModules[moduleId]; |
| /******/ } |
| /******/ } |
| /******/ if(parentJsonpFunction) parentJsonpFunction(data); |
| /******/ |
| /******/ while(resolves.length) { |
| /******/ resolves.shift()(); |
| /******/ } |
| /******/ |
| /******/ // add entry modules from loaded chunk to deferred list |
| /******/ deferredModules.push.apply(deferredModules, executeModules || []); |
| /******/ |
| /******/ // run deferred modules when all chunks ready |
| /******/ return checkDeferredModules(); |
| /******/ }; |
| /******/ function checkDeferredModules() { |
| /******/ var result; |
| /******/ for(var i = 0; i < deferredModules.length; i++) { |
| /******/ var deferredModule = deferredModules[i]; |
| /******/ var fulfilled = true; |
| /******/ for(var j = 1; j < deferredModule.length; j++) { |
| /******/ var depId = deferredModule[j]; |
| /******/ if(installedChunks[depId] !== 0) fulfilled = false; |
| /******/ } |
| /******/ if(fulfilled) { |
| /******/ deferredModules.splice(i--, 1); |
| /******/ result = __webpack_require__(__webpack_require__.s = deferredModule[0]); |
| /******/ } |
| /******/ } |
| /******/ |
| /******/ return result; |
| /******/ } |
| /******/ function hotDisposeChunk(chunkId) { |
| /******/ delete installedChunks[chunkId]; |
| /******/ } |
| /******/ var parentHotUpdateCallback = window["webpackHotUpdate"]; |
| /******/ window["webpackHotUpdate"] = // eslint-disable-next-line no-unused-vars |
| /******/ function webpackHotUpdateCallback(chunkId, moreModules) { |
| /******/ hotAddUpdateChunk(chunkId, moreModules); |
| /******/ if (parentHotUpdateCallback) parentHotUpdateCallback(chunkId, moreModules); |
| /******/ } ; |
| /******/ |
| /******/ // eslint-disable-next-line no-unused-vars |
| /******/ function hotDownloadUpdateChunk(chunkId) { |
| /******/ var script = document.createElement("script"); |
| /******/ script.charset = "utf-8"; |
| /******/ script.src = __webpack_require__.p + "" + chunkId + "." + hotCurrentHash + ".hot-update.js"; |
| /******/ if (null) script.crossOrigin = null; |
| /******/ document.head.appendChild(script); |
| /******/ } |
| /******/ |
| /******/ // eslint-disable-next-line no-unused-vars |
| /******/ function hotDownloadManifest(requestTimeout) { |
| /******/ requestTimeout = requestTimeout || 10000; |
| /******/ return new Promise(function(resolve, reject) { |
| /******/ if (typeof XMLHttpRequest === "undefined") { |
| /******/ return reject(new Error("No browser support")); |
| /******/ } |
| /******/ try { |
| /******/ var request = new XMLHttpRequest(); |
| /******/ var requestPath = __webpack_require__.p + "" + hotCurrentHash + ".hot-update.json"; |
| /******/ request.open("GET", requestPath, true); |
| /******/ request.timeout = requestTimeout; |
| /******/ request.send(null); |
| /******/ } catch (err) { |
| /******/ return reject(err); |
| /******/ } |
| /******/ request.onreadystatechange = function() { |
| /******/ if (request.readyState !== 4) return; |
| /******/ if (request.status === 0) { |
| /******/ // timeout |
| /******/ reject( |
| /******/ new Error("Manifest request to " + requestPath + " timed out.") |
| /******/ ); |
| /******/ } else if (request.status === 404) { |
| /******/ // no update available |
| /******/ resolve(); |
| /******/ } else if (request.status !== 200 && request.status !== 304) { |
| /******/ // other failure |
| /******/ reject(new Error("Manifest request to " + requestPath + " failed.")); |
| /******/ } else { |
| /******/ // success |
| /******/ try { |
| /******/ var update = JSON.parse(request.responseText); |
| /******/ } catch (e) { |
| /******/ reject(e); |
| /******/ return; |
| /******/ } |
| /******/ resolve(update); |
| /******/ } |
| /******/ }; |
| /******/ }); |
| /******/ } |
| /******/ |
| /******/ var hotApplyOnUpdate = true; |
| /******/ // eslint-disable-next-line no-unused-vars |
| /******/ var hotCurrentHash = "4ff01a0e327eddef25f9"; |
| /******/ var hotRequestTimeout = 10000; |
| /******/ var hotCurrentModuleData = {}; |
| /******/ var hotCurrentChildModule; |
| /******/ // eslint-disable-next-line no-unused-vars |
| /******/ var hotCurrentParents = []; |
| /******/ // eslint-disable-next-line no-unused-vars |
| /******/ var hotCurrentParentsTemp = []; |
| /******/ |
| /******/ // eslint-disable-next-line no-unused-vars |
| /******/ function hotCreateRequire(moduleId) { |
| /******/ var me = installedModules[moduleId]; |
| /******/ if (!me) return __webpack_require__; |
| /******/ var fn = function(request) { |
| /******/ if (me.hot.active) { |
| /******/ if (installedModules[request]) { |
| /******/ if (installedModules[request].parents.indexOf(moduleId) === -1) { |
| /******/ installedModules[request].parents.push(moduleId); |
| /******/ } |
| /******/ } else { |
| /******/ hotCurrentParents = [moduleId]; |
| /******/ hotCurrentChildModule = request; |
| /******/ } |
| /******/ if (me.children.indexOf(request) === -1) { |
| /******/ me.children.push(request); |
| /******/ } |
| /******/ } else { |
| /******/ console.warn( |
| /******/ "[HMR] unexpected require(" + |
| /******/ request + |
| /******/ ") from disposed module " + |
| /******/ moduleId |
| /******/ ); |
| /******/ hotCurrentParents = []; |
| /******/ } |
| /******/ return __webpack_require__(request); |
| /******/ }; |
| /******/ var ObjectFactory = function ObjectFactory(name) { |
| /******/ return { |
| /******/ configurable: true, |
| /******/ enumerable: true, |
| /******/ get: function() { |
| /******/ return __webpack_require__[name]; |
| /******/ }, |
| /******/ set: function(value) { |
| /******/ __webpack_require__[name] = value; |
| /******/ } |
| /******/ }; |
| /******/ }; |
| /******/ for (var name in __webpack_require__) { |
| /******/ if ( |
| /******/ Object.prototype.hasOwnProperty.call(__webpack_require__, name) && |
| /******/ name !== "e" && |
| /******/ name !== "t" |
| /******/ ) { |
| /******/ Object.defineProperty(fn, name, ObjectFactory(name)); |
| /******/ } |
| /******/ } |
| /******/ fn.e = function(chunkId) { |
| /******/ if (hotStatus === "ready") hotSetStatus("prepare"); |
| /******/ hotChunksLoading++; |
| /******/ return __webpack_require__.e(chunkId).then(finishChunkLoading, function(err) { |
| /******/ finishChunkLoading(); |
| /******/ throw err; |
| /******/ }); |
| /******/ |
| /******/ function finishChunkLoading() { |
| /******/ hotChunksLoading--; |
| /******/ if (hotStatus === "prepare") { |
| /******/ if (!hotWaitingFilesMap[chunkId]) { |
| /******/ hotEnsureUpdateChunk(chunkId); |
| /******/ } |
| /******/ if (hotChunksLoading === 0 && hotWaitingFiles === 0) { |
| /******/ hotUpdateDownloaded(); |
| /******/ } |
| /******/ } |
| /******/ } |
| /******/ }; |
| /******/ fn.t = function(value, mode) { |
| /******/ if (mode & 1) value = fn(value); |
| /******/ return __webpack_require__.t(value, mode & ~1); |
| /******/ }; |
| /******/ return fn; |
| /******/ } |
| /******/ |
| /******/ // eslint-disable-next-line no-unused-vars |
| /******/ function hotCreateModule(moduleId) { |
| /******/ var hot = { |
| /******/ // private stuff |
| /******/ _acceptedDependencies: {}, |
| /******/ _declinedDependencies: {}, |
| /******/ _selfAccepted: false, |
| /******/ _selfDeclined: false, |
| /******/ _disposeHandlers: [], |
| /******/ _main: hotCurrentChildModule !== moduleId, |
| /******/ |
| /******/ // Module API |
| /******/ active: true, |
| /******/ accept: function(dep, callback) { |
| /******/ if (dep === undefined) hot._selfAccepted = true; |
| /******/ else if (typeof dep === "function") hot._selfAccepted = dep; |
| /******/ else if (typeof dep === "object") |
| /******/ for (var i = 0; i < dep.length; i++) |
| /******/ hot._acceptedDependencies[dep[i]] = callback || function() {}; |
| /******/ else hot._acceptedDependencies[dep] = callback || function() {}; |
| /******/ }, |
| /******/ decline: function(dep) { |
| /******/ if (dep === undefined) hot._selfDeclined = true; |
| /******/ else if (typeof dep === "object") |
| /******/ for (var i = 0; i < dep.length; i++) |
| /******/ hot._declinedDependencies[dep[i]] = true; |
| /******/ else hot._declinedDependencies[dep] = true; |
| /******/ }, |
| /******/ dispose: function(callback) { |
| /******/ hot._disposeHandlers.push(callback); |
| /******/ }, |
| /******/ addDisposeHandler: function(callback) { |
| /******/ hot._disposeHandlers.push(callback); |
| /******/ }, |
| /******/ removeDisposeHandler: function(callback) { |
| /******/ var idx = hot._disposeHandlers.indexOf(callback); |
| /******/ if (idx >= 0) hot._disposeHandlers.splice(idx, 1); |
| /******/ }, |
| /******/ |
| /******/ // Management API |
| /******/ check: hotCheck, |
| /******/ apply: hotApply, |
| /******/ status: function(l) { |
| /******/ if (!l) return hotStatus; |
| /******/ hotStatusHandlers.push(l); |
| /******/ }, |
| /******/ addStatusHandler: function(l) { |
| /******/ hotStatusHandlers.push(l); |
| /******/ }, |
| /******/ removeStatusHandler: function(l) { |
| /******/ var idx = hotStatusHandlers.indexOf(l); |
| /******/ if (idx >= 0) hotStatusHandlers.splice(idx, 1); |
| /******/ }, |
| /******/ |
| /******/ //inherit from previous dispose call |
| /******/ data: hotCurrentModuleData[moduleId] |
| /******/ }; |
| /******/ hotCurrentChildModule = undefined; |
| /******/ return hot; |
| /******/ } |
| /******/ |
| /******/ var hotStatusHandlers = []; |
| /******/ var hotStatus = "idle"; |
| /******/ |
| /******/ function hotSetStatus(newStatus) { |
| /******/ hotStatus = newStatus; |
| /******/ for (var i = 0; i < hotStatusHandlers.length; i++) |
| /******/ hotStatusHandlers[i].call(null, newStatus); |
| /******/ } |
| /******/ |
| /******/ // while downloading |
| /******/ var hotWaitingFiles = 0; |
| /******/ var hotChunksLoading = 0; |
| /******/ var hotWaitingFilesMap = {}; |
| /******/ var hotRequestedFilesMap = {}; |
| /******/ var hotAvailableFilesMap = {}; |
| /******/ var hotDeferred; |
| /******/ |
| /******/ // The update info |
| /******/ var hotUpdate, hotUpdateNewHash; |
| /******/ |
| /******/ function toModuleId(id) { |
| /******/ var isNumber = +id + "" === id; |
| /******/ return isNumber ? +id : id; |
| /******/ } |
| /******/ |
| /******/ function hotCheck(apply) { |
| /******/ if (hotStatus !== "idle") { |
| /******/ throw new Error("check() is only allowed in idle status"); |
| /******/ } |
| /******/ hotApplyOnUpdate = apply; |
| /******/ hotSetStatus("check"); |
| /******/ return hotDownloadManifest(hotRequestTimeout).then(function(update) { |
| /******/ if (!update) { |
| /******/ hotSetStatus("idle"); |
| /******/ return null; |
| /******/ } |
| /******/ hotRequestedFilesMap = {}; |
| /******/ hotWaitingFilesMap = {}; |
| /******/ hotAvailableFilesMap = update.c; |
| /******/ hotUpdateNewHash = update.h; |
| /******/ |
| /******/ hotSetStatus("prepare"); |
| /******/ var promise = new Promise(function(resolve, reject) { |
| /******/ hotDeferred = { |
| /******/ resolve: resolve, |
| /******/ reject: reject |
| /******/ }; |
| /******/ }); |
| /******/ hotUpdate = {}; |
| /******/ for(var chunkId in installedChunks) |
| /******/ // eslint-disable-next-line no-lone-blocks |
| /******/ { |
| /******/ /*globals chunkId */ |
| /******/ hotEnsureUpdateChunk(chunkId); |
| /******/ } |
| /******/ if ( |
| /******/ hotStatus === "prepare" && |
| /******/ hotChunksLoading === 0 && |
| /******/ hotWaitingFiles === 0 |
| /******/ ) { |
| /******/ hotUpdateDownloaded(); |
| /******/ } |
| /******/ return promise; |
| /******/ }); |
| /******/ } |
| /******/ |
| /******/ // eslint-disable-next-line no-unused-vars |
| /******/ function hotAddUpdateChunk(chunkId, moreModules) { |
| /******/ if (!hotAvailableFilesMap[chunkId] || !hotRequestedFilesMap[chunkId]) |
| /******/ return; |
| /******/ hotRequestedFilesMap[chunkId] = false; |
| /******/ for (var moduleId in moreModules) { |
| /******/ if (Object.prototype.hasOwnProperty.call(moreModules, moduleId)) { |
| /******/ hotUpdate[moduleId] = moreModules[moduleId]; |
| /******/ } |
| /******/ } |
| /******/ if (--hotWaitingFiles === 0 && hotChunksLoading === 0) { |
| /******/ hotUpdateDownloaded(); |
| /******/ } |
| /******/ } |
| /******/ |
| /******/ function hotEnsureUpdateChunk(chunkId) { |
| /******/ if (!hotAvailableFilesMap[chunkId]) { |
| /******/ hotWaitingFilesMap[chunkId] = true; |
| /******/ } else { |
| /******/ hotRequestedFilesMap[chunkId] = true; |
| /******/ hotWaitingFiles++; |
| /******/ hotDownloadUpdateChunk(chunkId); |
| /******/ } |
| /******/ } |
| /******/ |
| /******/ function hotUpdateDownloaded() { |
| /******/ hotSetStatus("ready"); |
| /******/ var deferred = hotDeferred; |
| /******/ hotDeferred = null; |
| /******/ if (!deferred) return; |
| /******/ if (hotApplyOnUpdate) { |
| /******/ // Wrap deferred object in Promise to mark it as a well-handled Promise to |
| /******/ // avoid triggering uncaught exception warning in Chrome. |
| /******/ // See https://bugs.chromium.org/p/chromium/issues/detail?id=465666 |
| /******/ Promise.resolve() |
| /******/ .then(function() { |
| /******/ return hotApply(hotApplyOnUpdate); |
| /******/ }) |
| /******/ .then( |
| /******/ function(result) { |
| /******/ deferred.resolve(result); |
| /******/ }, |
| /******/ function(err) { |
| /******/ deferred.reject(err); |
| /******/ } |
| /******/ ); |
| /******/ } else { |
| /******/ var outdatedModules = []; |
| /******/ for (var id in hotUpdate) { |
| /******/ if (Object.prototype.hasOwnProperty.call(hotUpdate, id)) { |
| /******/ outdatedModules.push(toModuleId(id)); |
| /******/ } |
| /******/ } |
| /******/ deferred.resolve(outdatedModules); |
| /******/ } |
| /******/ } |
| /******/ |
| /******/ function hotApply(options) { |
| /******/ if (hotStatus !== "ready") |
| /******/ throw new Error("apply() is only allowed in ready status"); |
| /******/ options = options || {}; |
| /******/ |
| /******/ var cb; |
| /******/ var i; |
| /******/ var j; |
| /******/ var module; |
| /******/ var moduleId; |
| /******/ |
| /******/ function getAffectedStuff(updateModuleId) { |
| /******/ var outdatedModules = [updateModuleId]; |
| /******/ var outdatedDependencies = {}; |
| /******/ |
| /******/ var queue = outdatedModules.map(function(id) { |
| /******/ return { |
| /******/ chain: [id], |
| /******/ id: id |
| /******/ }; |
| /******/ }); |
| /******/ while (queue.length > 0) { |
| /******/ var queueItem = queue.pop(); |
| /******/ var moduleId = queueItem.id; |
| /******/ var chain = queueItem.chain; |
| /******/ module = installedModules[moduleId]; |
| /******/ if (!module || module.hot._selfAccepted) continue; |
| /******/ if (module.hot._selfDeclined) { |
| /******/ return { |
| /******/ type: "self-declined", |
| /******/ chain: chain, |
| /******/ moduleId: moduleId |
| /******/ }; |
| /******/ } |
| /******/ if (module.hot._main) { |
| /******/ return { |
| /******/ type: "unaccepted", |
| /******/ chain: chain, |
| /******/ moduleId: moduleId |
| /******/ }; |
| /******/ } |
| /******/ for (var i = 0; i < module.parents.length; i++) { |
| /******/ var parentId = module.parents[i]; |
| /******/ var parent = installedModules[parentId]; |
| /******/ if (!parent) continue; |
| /******/ if (parent.hot._declinedDependencies[moduleId]) { |
| /******/ return { |
| /******/ type: "declined", |
| /******/ chain: chain.concat([parentId]), |
| /******/ moduleId: moduleId, |
| /******/ parentId: parentId |
| /******/ }; |
| /******/ } |
| /******/ if (outdatedModules.indexOf(parentId) !== -1) continue; |
| /******/ if (parent.hot._acceptedDependencies[moduleId]) { |
| /******/ if (!outdatedDependencies[parentId]) |
| /******/ outdatedDependencies[parentId] = []; |
| /******/ addAllToSet(outdatedDependencies[parentId], [moduleId]); |
| /******/ continue; |
| /******/ } |
| /******/ delete outdatedDependencies[parentId]; |
| /******/ outdatedModules.push(parentId); |
| /******/ queue.push({ |
| /******/ chain: chain.concat([parentId]), |
| /******/ id: parentId |
| /******/ }); |
| /******/ } |
| /******/ } |
| /******/ |
| /******/ return { |
| /******/ type: "accepted", |
| /******/ moduleId: updateModuleId, |
| /******/ outdatedModules: outdatedModules, |
| /******/ outdatedDependencies: outdatedDependencies |
| /******/ }; |
| /******/ } |
| /******/ |
| /******/ function addAllToSet(a, b) { |
| /******/ for (var i = 0; i < b.length; i++) { |
| /******/ var item = b[i]; |
| /******/ if (a.indexOf(item) === -1) a.push(item); |
| /******/ } |
| /******/ } |
| /******/ |
| /******/ // at begin all updates modules are outdated |
| /******/ // the "outdated" status can propagate to parents if they don't accept the children |
| /******/ var outdatedDependencies = {}; |
| /******/ var outdatedModules = []; |
| /******/ var appliedUpdate = {}; |
| /******/ |
| /******/ var warnUnexpectedRequire = function warnUnexpectedRequire() { |
| /******/ console.warn( |
| /******/ "[HMR] unexpected require(" + result.moduleId + ") to disposed module" |
| /******/ ); |
| /******/ }; |
| /******/ |
| /******/ for (var id in hotUpdate) { |
| /******/ if (Object.prototype.hasOwnProperty.call(hotUpdate, id)) { |
| /******/ moduleId = toModuleId(id); |
| /******/ /** @type {TODO} */ |
| /******/ var result; |
| /******/ if (hotUpdate[id]) { |
| /******/ result = getAffectedStuff(moduleId); |
| /******/ } else { |
| /******/ result = { |
| /******/ type: "disposed", |
| /******/ moduleId: id |
| /******/ }; |
| /******/ } |
| /******/ /** @type {Error|false} */ |
| /******/ var abortError = false; |
| /******/ var doApply = false; |
| /******/ var doDispose = false; |
| /******/ var chainInfo = ""; |
| /******/ if (result.chain) { |
| /******/ chainInfo = "\nUpdate propagation: " + result.chain.join(" -> "); |
| /******/ } |
| /******/ switch (result.type) { |
| /******/ case "self-declined": |
| /******/ if (options.onDeclined) options.onDeclined(result); |
| /******/ if (!options.ignoreDeclined) |
| /******/ abortError = new Error( |
| /******/ "Aborted because of self decline: " + |
| /******/ result.moduleId + |
| /******/ chainInfo |
| /******/ ); |
| /******/ break; |
| /******/ case "declined": |
| /******/ if (options.onDeclined) options.onDeclined(result); |
| /******/ if (!options.ignoreDeclined) |
| /******/ abortError = new Error( |
| /******/ "Aborted because of declined dependency: " + |
| /******/ result.moduleId + |
| /******/ " in " + |
| /******/ result.parentId + |
| /******/ chainInfo |
| /******/ ); |
| /******/ break; |
| /******/ case "unaccepted": |
| /******/ if (options.onUnaccepted) options.onUnaccepted(result); |
| /******/ if (!options.ignoreUnaccepted) |
| /******/ abortError = new Error( |
| /******/ "Aborted because " + moduleId + " is not accepted" + chainInfo |
| /******/ ); |
| /******/ break; |
| /******/ case "accepted": |
| /******/ if (options.onAccepted) options.onAccepted(result); |
| /******/ doApply = true; |
| /******/ break; |
| /******/ case "disposed": |
| /******/ if (options.onDisposed) options.onDisposed(result); |
| /******/ doDispose = true; |
| /******/ break; |
| /******/ default: |
| /******/ throw new Error("Unexception type " + result.type); |
| /******/ } |
| /******/ if (abortError) { |
| /******/ hotSetStatus("abort"); |
| /******/ return Promise.reject(abortError); |
| /******/ } |
| /******/ if (doApply) { |
| /******/ appliedUpdate[moduleId] = hotUpdate[moduleId]; |
| /******/ addAllToSet(outdatedModules, result.outdatedModules); |
| /******/ for (moduleId in result.outdatedDependencies) { |
| /******/ if ( |
| /******/ Object.prototype.hasOwnProperty.call( |
| /******/ result.outdatedDependencies, |
| /******/ moduleId |
| /******/ ) |
| /******/ ) { |
| /******/ if (!outdatedDependencies[moduleId]) |
| /******/ outdatedDependencies[moduleId] = []; |
| /******/ addAllToSet( |
| /******/ outdatedDependencies[moduleId], |
| /******/ result.outdatedDependencies[moduleId] |
| /******/ ); |
| /******/ } |
| /******/ } |
| /******/ } |
| /******/ if (doDispose) { |
| /******/ addAllToSet(outdatedModules, [result.moduleId]); |
| /******/ appliedUpdate[moduleId] = warnUnexpectedRequire; |
| /******/ } |
| /******/ } |
| /******/ } |
| /******/ |
| /******/ // Store self accepted outdated modules to require them later by the module system |
| /******/ var outdatedSelfAcceptedModules = []; |
| /******/ for (i = 0; i < outdatedModules.length; i++) { |
| /******/ moduleId = outdatedModules[i]; |
| /******/ if ( |
| /******/ installedModules[moduleId] && |
| /******/ installedModules[moduleId].hot._selfAccepted && |
| /******/ // removed self-accepted modules should not be required |
| /******/ appliedUpdate[moduleId] !== warnUnexpectedRequire |
| /******/ ) { |
| /******/ outdatedSelfAcceptedModules.push({ |
| /******/ module: moduleId, |
| /******/ errorHandler: installedModules[moduleId].hot._selfAccepted |
| /******/ }); |
| /******/ } |
| /******/ } |
| /******/ |
| /******/ // Now in "dispose" phase |
| /******/ hotSetStatus("dispose"); |
| /******/ Object.keys(hotAvailableFilesMap).forEach(function(chunkId) { |
| /******/ if (hotAvailableFilesMap[chunkId] === false) { |
| /******/ hotDisposeChunk(chunkId); |
| /******/ } |
| /******/ }); |
| /******/ |
| /******/ var idx; |
| /******/ var queue = outdatedModules.slice(); |
| /******/ while (queue.length > 0) { |
| /******/ moduleId = queue.pop(); |
| /******/ module = installedModules[moduleId]; |
| /******/ if (!module) continue; |
| /******/ |
| /******/ var data = {}; |
| /******/ |
| /******/ // Call dispose handlers |
| /******/ var disposeHandlers = module.hot._disposeHandlers; |
| /******/ for (j = 0; j < disposeHandlers.length; j++) { |
| /******/ cb = disposeHandlers[j]; |
| /******/ cb(data); |
| /******/ } |
| /******/ hotCurrentModuleData[moduleId] = data; |
| /******/ |
| /******/ // disable module (this disables requires from this module) |
| /******/ module.hot.active = false; |
| /******/ |
| /******/ // remove module from cache |
| /******/ delete installedModules[moduleId]; |
| /******/ |
| /******/ // when disposing there is no need to call dispose handler |
| /******/ delete outdatedDependencies[moduleId]; |
| /******/ |
| /******/ // remove "parents" references from all children |
| /******/ for (j = 0; j < module.children.length; j++) { |
| /******/ var child = installedModules[module.children[j]]; |
| /******/ if (!child) continue; |
| /******/ idx = child.parents.indexOf(moduleId); |
| /******/ if (idx >= 0) { |
| /******/ child.parents.splice(idx, 1); |
| /******/ } |
| /******/ } |
| /******/ } |
| /******/ |
| /******/ // remove outdated dependency from module children |
| /******/ var dependency; |
| /******/ var moduleOutdatedDependencies; |
| /******/ for (moduleId in outdatedDependencies) { |
| /******/ if ( |
| /******/ Object.prototype.hasOwnProperty.call(outdatedDependencies, moduleId) |
| /******/ ) { |
| /******/ module = installedModules[moduleId]; |
| /******/ if (module) { |
| /******/ moduleOutdatedDependencies = outdatedDependencies[moduleId]; |
| /******/ for (j = 0; j < moduleOutdatedDependencies.length; j++) { |
| /******/ dependency = moduleOutdatedDependencies[j]; |
| /******/ idx = module.children.indexOf(dependency); |
| /******/ if (idx >= 0) module.children.splice(idx, 1); |
| /******/ } |
| /******/ } |
| /******/ } |
| /******/ } |
| /******/ |
| /******/ // Now in "apply" phase |
| /******/ hotSetStatus("apply"); |
| /******/ |
| /******/ hotCurrentHash = hotUpdateNewHash; |
| /******/ |
| /******/ // insert new code |
| /******/ for (moduleId in appliedUpdate) { |
| /******/ if (Object.prototype.hasOwnProperty.call(appliedUpdate, moduleId)) { |
| /******/ modules[moduleId] = appliedUpdate[moduleId]; |
| /******/ } |
| /******/ } |
| /******/ |
| /******/ // call accept handlers |
| /******/ var error = null; |
| /******/ for (moduleId in outdatedDependencies) { |
| /******/ if ( |
| /******/ Object.prototype.hasOwnProperty.call(outdatedDependencies, moduleId) |
| /******/ ) { |
| /******/ module = installedModules[moduleId]; |
| /******/ if (module) { |
| /******/ moduleOutdatedDependencies = outdatedDependencies[moduleId]; |
| /******/ var callbacks = []; |
| /******/ for (i = 0; i < moduleOutdatedDependencies.length; i++) { |
| /******/ dependency = moduleOutdatedDependencies[i]; |
| /******/ cb = module.hot._acceptedDependencies[dependency]; |
| /******/ if (cb) { |
| /******/ if (callbacks.indexOf(cb) !== -1) continue; |
| /******/ callbacks.push(cb); |
| /******/ } |
| /******/ } |
| /******/ for (i = 0; i < callbacks.length; i++) { |
| /******/ cb = callbacks[i]; |
| /******/ try { |
| /******/ cb(moduleOutdatedDependencies); |
| /******/ } catch (err) { |
| /******/ if (options.onErrored) { |
| /******/ options.onErrored({ |
| /******/ type: "accept-errored", |
| /******/ moduleId: moduleId, |
| /******/ dependencyId: moduleOutdatedDependencies[i], |
| /******/ error: err |
| /******/ }); |
| /******/ } |
| /******/ if (!options.ignoreErrored) { |
| /******/ if (!error) error = err; |
| /******/ } |
| /******/ } |
| /******/ } |
| /******/ } |
| /******/ } |
| /******/ } |
| /******/ |
| /******/ // Load self accepted modules |
| /******/ for (i = 0; i < outdatedSelfAcceptedModules.length; i++) { |
| /******/ var item = outdatedSelfAcceptedModules[i]; |
| /******/ moduleId = item.module; |
| /******/ hotCurrentParents = [moduleId]; |
| /******/ try { |
| /******/ __webpack_require__(moduleId); |
| /******/ } catch (err) { |
| /******/ if (typeof item.errorHandler === "function") { |
| /******/ try { |
| /******/ item.errorHandler(err); |
| /******/ } catch (err2) { |
| /******/ if (options.onErrored) { |
| /******/ options.onErrored({ |
| /******/ type: "self-accept-error-handler-errored", |
| /******/ moduleId: moduleId, |
| /******/ error: err2, |
| /******/ originalError: err |
| /******/ }); |
| /******/ } |
| /******/ if (!options.ignoreErrored) { |
| /******/ if (!error) error = err2; |
| /******/ } |
| /******/ if (!error) error = err; |
| /******/ } |
| /******/ } else { |
| /******/ if (options.onErrored) { |
| /******/ options.onErrored({ |
| /******/ type: "self-accept-errored", |
| /******/ moduleId: moduleId, |
| /******/ error: err |
| /******/ }); |
| /******/ } |
| /******/ if (!options.ignoreErrored) { |
| /******/ if (!error) error = err; |
| /******/ } |
| /******/ } |
| /******/ } |
| /******/ } |
| /******/ |
| /******/ // handle errors in accept handlers and self accepted module load |
| /******/ if (error) { |
| /******/ hotSetStatus("fail"); |
| /******/ return Promise.reject(error); |
| /******/ } |
| /******/ |
| /******/ hotSetStatus("idle"); |
| /******/ return new Promise(function(resolve) { |
| /******/ resolve(outdatedModules); |
| /******/ }); |
| /******/ } |
| /******/ |
| /******/ // The module cache |
| /******/ var installedModules = {}; |
| /******/ |
| /******/ // object to store loaded and loading chunks |
| /******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched |
| /******/ // Promise = chunk loading, 0 = chunk loaded |
| /******/ var installedChunks = { |
| /******/ "fds-demo.bundle.min": 0 |
| /******/ }; |
| /******/ |
| /******/ var deferredModules = []; |
| /******/ |
| /******/ // 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: {}, |
| /******/ hot: hotCreateModule(moduleId), |
| /******/ parents: (hotCurrentParentsTemp = hotCurrentParents, hotCurrentParents = [], hotCurrentParentsTemp), |
| /******/ children: [] |
| /******/ }; |
| /******/ |
| /******/ // Execute the module function |
| /******/ modules[moduleId].call(module.exports, module, module.exports, hotCreateRequire(moduleId)); |
| /******/ |
| /******/ // 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, { enumerable: true, get: getter }); |
| /******/ } |
| /******/ }; |
| /******/ |
| /******/ // define __esModule on exports |
| /******/ __webpack_require__.r = function(exports) { |
| /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { |
| /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); |
| /******/ } |
| /******/ Object.defineProperty(exports, '__esModule', { value: true }); |
| /******/ }; |
| /******/ |
| /******/ // create a fake namespace object |
| /******/ // mode & 1: value is a module id, require it |
| /******/ // mode & 2: merge all properties of value into the ns |
| /******/ // mode & 4: return value when already ns object |
| /******/ // mode & 8|1: behave like require |
| /******/ __webpack_require__.t = function(value, mode) { |
| /******/ if(mode & 1) value = __webpack_require__(value); |
| /******/ if(mode & 8) return value; |
| /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; |
| /******/ var ns = Object.create(null); |
| /******/ __webpack_require__.r(ns); |
| /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); |
| /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); |
| /******/ return ns; |
| /******/ }; |
| /******/ |
| /******/ // 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 = ""; |
| /******/ |
| /******/ // __webpack_hash__ |
| /******/ __webpack_require__.h = function() { return hotCurrentHash; }; |
| /******/ |
| /******/ var jsonpArray = window["webpackJsonp"] = window["webpackJsonp"] || []; |
| /******/ var oldJsonpFunction = jsonpArray.push.bind(jsonpArray); |
| /******/ jsonpArray.push = webpackJsonpCallback; |
| /******/ jsonpArray = jsonpArray.slice(); |
| /******/ for(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]); |
| /******/ var parentJsonpFunction = oldJsonpFunction; |
| /******/ |
| /******/ |
| /******/ // add entry module to deferred list |
| /******/ deferredModules.push(["./webapp/fds-bootstrap.js","fds-demo.vendor.min"]); |
| /******/ // run deferred modules when ready |
| /******/ return checkDeferredModules(); |
| /******/ }) |
| /************************************************************************/ |
| /******/ ({ |
| |
| /***/ "./node_modules/@angular/core/fesm5 lazy recursive": |
| /*!****************************************************************!*\ |
| !*** ./node_modules/@angular/core/fesm5 lazy namespace object ***! |
| \****************************************************************/ |
| /*! no static exports found */ |
| /***/ (function(module, exports) { |
| |
| function webpackEmptyAsyncContext(req) { |
| // Here Promise.resolve().then() is used instead of new Promise() to prevent |
| // uncaught exception popping up in devtools |
| return Promise.resolve().then(function() { |
| var e = new Error("Cannot find module '" + req + "'"); |
| e.code = 'MODULE_NOT_FOUND'; |
| throw e; |
| }); |
| } |
| webpackEmptyAsyncContext.keys = function() { return []; }; |
| webpackEmptyAsyncContext.resolve = webpackEmptyAsyncContext; |
| module.exports = webpackEmptyAsyncContext; |
| webpackEmptyAsyncContext.id = "./node_modules/@angular/core/fesm5 lazy recursive"; |
| |
| /***/ }), |
| |
| /***/ "./package.json": |
| /*!**********************!*\ |
| !*** ./package.json ***! |
| \**********************/ |
| /*! exports provided: //, name, version, scripts, husky, description, module, keywords, repository, bugs, license, dependencies, devDependencies, engines, default */ |
| /***/ (function(module) { |
| |
| module.exports = JSON.parse("{\"//\":\"limitations under the License.\",\"name\":\"nifi-fds\",\"version\":\"0.2.0\",\"scripts\":{\"start\":\"./node_modules/http-server/bin/http-server --gzip -p 28080 .\",\"build:webapp:bundle:development\":\"npm run webpack:development\",\"build:webapp:bundle:production\":\"npm run webpack:production\",\"clean:install\":\"bash ./scripts/clean-install\",\"clean:install:skipTests\":\"bash ./scripts/clean-install-skipTests\",\"dev:install\":\"bash ./scripts/dev-install\",\"dev:install:skipTests\":\"bash ./scripts/dev-install-skipTests\",\"publish\":\"bash ./scripts/npm-publish\",\"test\":\"karma start karma.conf.js --single-run\",\"test:dev\":\"karma start karma.conf.js\",\"watch\":\"npm run webpack:development && ./node_modules/.bin/webpack-dev-server --config webpack.dev.js\",\"webpack:analyze\":\"./node_modules/.bin/webpack-bundle-analyzer webpack-build-log.json ./\",\"webpack:development\":\"./node_modules/.bin/webpack --config webpack.dev.js\",\"webpack:production\":\"npm run lint && ./node_modules/.bin/webpack --config webpack.prod.js --json --progress --profile > webpack-build-log.json\",\"eslint\":\"./node_modules/.bin/eslint './webapp/**/*.js' './platform/**/*.js'\",\"stylelint\":\"./node_modules/.bin/stylelint './webapp/theming/**/*.scss' './platform/**/*.scss'\",\"lint\":\"npm run eslint && npm run stylelint\"},\"husky\":{\"hooks\":{\"pre-commit\":\"npm run lint\",\"pre-push\":\"npm run test\"}},\"description\":\"The Apache NiFi Flow Design System module is an atomic reusable platform providing consistent set of UI/UX components for open source friendly web applications to consume.\",\"module\":\"./platform/core/flow-design-system.module.js\",\"keywords\":[\"flow design system\",\"angular\",\"material\",\"material design\",\"components\",\"reusable\",\"nifi-fds\",\"covalent\"],\"repository\":{\"type\":\"git\",\"url\":\"https://github.com/apache/nifi-fds.git\"},\"bugs\":{\"url\":\"https://github.com/apache/nifi-fds/issues\"},\"license\":\"Apache-2.0\",\"dependencies\":{\"@angular/animations\":\"8.1.1\",\"@angular/cdk\":\"8.1.0\",\"@angular/common\":\"8.1.1\",\"@angular/compiler\":\"8.1.1\",\"@angular/core\":\"8.1.1\",\"@angular/flex-layout\":\"8.0.0-beta.26\",\"@angular/forms\":\"8.1.1\",\"@angular/http\":\"8.0.0-beta.10\",\"@angular/material\":\"8.1.0\",\"@angular/platform-browser\":\"8.1.1\",\"@angular/platform-browser-dynamic\":\"8.1.1\",\"@angular/router\":\"8.1.1\",\"@covalent/core\":\"2.1.0\",\"detect-libc\":\"1.0.3\",\"font-awesome\":\"4.7.0\",\"hammerjs\":\"2.0.8\",\"jquery\":\"3.4.1\",\"roboto-fontface\":\"0.10.0\",\"rxjs\":\"6.5.2\",\"zone.js\":\"0.9.1\"},\"devDependencies\":{\"@babel/core\":\"7.5.4\",\"@babel/preset-env\":\"7.5.4\",\"@babel/runtime\":\"7.5.4\",\"@types/core-js\":\"2.5.2\",\"@typescript-eslint/eslint-plugin\":\"1.12.0\",\"@typescript-eslint/parser\":\"1.12.0\",\"babel-eslint\":\"10.0.2\",\"babel-loader\":\"8.0.6\",\"babel-plugin-istanbul\":\"5.1.4\",\"babel-polyfill\":\"6.26.0\",\"cache-loader\":\"4.0.1\",\"compression-webpack-plugin\":\"3.0.0\",\"css-loader\":\"3.0.0\",\"dtsgenerator\":\"2.0.8\",\"eslint\":\"6.0.1\",\"eslint-config-airbnb\":\"17.1.1\",\"eslint-plugin-import\":\"2.18.0\",\"eslint-plugin-jsx-a11y\":\"6.2.3\",\"eslint-plugin-react\":\"7.14.2\",\"file-loader\":\"4.0.0\",\"grunt\":\"1.0.4\",\"grunt-bump\":\"0.8.0\",\"grunt-cli\":\"1.3.2\",\"html-loader\":\"0.5.5\",\"html-webpack-plugin\":\"3.2.0\",\"http-server\":\"0.11.1\",\"husky\":\"3.0.0\",\"istanbul-instrumenter-loader\":\"3.0.1\",\"jasmine\":\"3.4.0\",\"karma\":\"4.2.0\",\"karma-chrome-launcher\":\"3.0.0\",\"karma-cli\":\"2.0.0\",\"karma-coverage\":\"1.1.2\",\"karma-coverage-istanbul-reporter\":\"2.0.5\",\"karma-jasmine\":\"2.0.1\",\"karma-jasmine-html-reporter\":\"1.4.2\",\"karma-spec-reporter\":\"0.0.32\",\"karma-webpack\":\"4.0.2\",\"license-webpack-plugin\":\"2.1.1\",\"load-grunt-tasks\":\"5.0.0\",\"mini-css-extract-plugin\":\"0.7.0\",\"node-sass\":\"4.12.0\",\"null-loader\":\"3.0.0\",\"optimize-css-assets-webpack-plugin\":\"5.0.3\",\"sass-loader\":\"7.1.0\",\"style-loader\":\"0.23.1\",\"stylelint\":\"10.1.0\",\"stylelint-config-standard\":\"18.3.0\",\"terser-webpack-plugin\":\"1.3.0\",\"ts-loader\":\"6.0.4\",\"typescript\":\"3.5.3\",\"webpack\":\"4.35.3\",\"webpack-bundle-analyzer\":\"3.3.2\",\"webpack-cli\":\"3.3.6\",\"webpack-dev-server\":\"3.7.2\",\"webpack-fix-style-only-entries\":\"0.3.0\",\"webpack-merge\":\"4.2.1\"},\"engines\":{\"node\":\"=8.10.0\",\"npm\":\"=5.6.0\"}}"); |
| |
| /***/ }), |
| |
| /***/ "./platform/core/common/fds-common.module.js": |
| /*!***************************************************!*\ |
| !*** ./platform/core/common/fds-common.module.js ***! |
| \***************************************************/ |
| /*! exports provided: FdsCommonsModule, FdsStorageService */ |
| /***/ (function(module, __webpack_exports__, __webpack_require__) { |
| |
| "use strict"; |
| __webpack_require__.r(__webpack_exports__); |
| /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FdsCommonsModule", function() { return FdsCommonsModule; }); |
| /* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js"); |
| /* harmony import */ var _services_fds_storage_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./services/fds-storage.service */ "./platform/core/common/services/fds-storage.service.js"); |
| /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsStorageService", function() { return _services_fds_storage_service__WEBPACK_IMPORTED_MODULE_1__["default"]; }); |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| |
| /** |
| * FdsCommonsModule constructor. |
| * |
| * @constructor |
| */ |
| |
| function FdsCommonsModule() {} |
| |
| FdsCommonsModule.prototype = { |
| constructor: FdsCommonsModule |
| }; |
| FdsCommonsModule.annotations = [new _angular_core__WEBPACK_IMPORTED_MODULE_0__["NgModule"]({ |
| imports: [], |
| declarations: [], |
| exports: [], |
| providers: [_services_fds_storage_service__WEBPACK_IMPORTED_MODULE_1__["default"]] |
| })]; |
| |
| |
| /***/ }), |
| |
| /***/ "./platform/core/common/fds.animations.js": |
| /*!************************************************!*\ |
| !*** ./platform/core/common/fds.animations.js ***! |
| \************************************************/ |
| /*! exports provided: default */ |
| /***/ (function(module, __webpack_exports__, __webpack_require__) { |
| |
| "use strict"; |
| __webpack_require__.r(__webpack_exports__); |
| /* harmony import */ var _angular_animations__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/animations */ "./node_modules/@angular/animations/fesm5/animations.js"); |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /** |
| * FdsAnimations constructor. |
| * |
| * @constructor |
| */ |
| |
| function FdsAnimations() {} |
| |
| FdsAnimations.prototype = { |
| constructor: FdsAnimations, |
| |
| /** |
| * Fade animation |
| */ |
| fadeAnimation: Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["trigger"])('routeAnimation', [Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["state"])('*', Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["style"])({ |
| opacity: 1 |
| })), Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])(':enter', [Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["style"])({ |
| opacity: 0 |
| }), Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["animate"])('0.5s ease-in')]), Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])(':leave', [Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["animate"])('0.5s ease-out', Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["style"])({ |
| opacity: 0 |
| }))])]), |
| |
| /** |
| * Slide in from the left animation |
| */ |
| slideInLeftAnimation: Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["trigger"])('routeAnimation', [Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["state"])('*', Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["style"])({ |
| opacity: 1, |
| transform: 'translateX(0)' |
| })), Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])(':enter', [Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["style"])({ |
| opacity: 0, |
| transform: 'translateX(-100%)' |
| }), Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["animate"])('0.5s ease-in')]), Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])(':leave', [Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["animate"])('0.5s ease-out', Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["style"])({ |
| opacity: 0, |
| transform: 'translateX(100%)' |
| }))])]), |
| |
| /** |
| * Slide in from the top animation |
| */ |
| slideInDownAnimation: Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["trigger"])('routeAnimation', [Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["state"])('*', Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["style"])({ |
| opacity: 1, |
| transform: 'translateY(0)' |
| })), Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])(':enter', [Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["style"])({ |
| opacity: 0, |
| transform: 'translateY(-100%)' |
| }), Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["animate"])('0.5s ease-in')]), Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])(':leave', [Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["animate"])('0.5s ease-out', Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["style"])({ |
| opacity: 0, |
| transform: 'translateY(100%)' |
| }))])]), |
| |
| /** |
| * Fly in/out animation |
| */ |
| flyInOutAnimation: Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["trigger"])('flyInOut', [Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["state"])('in', Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["style"])({ |
| transform: 'translateX(0)' |
| })), Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('void => *', [Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["style"])({ |
| transform: 'translateX(100%)' |
| }), Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["animate"])('0.4s 0.1s ease-in')]), Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('* => void', Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["animate"])('0.2s ease-out', Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["style"])({ |
| transform: 'translateX(-100%)' |
| })))]), |
| |
| /** |
| * Fly in/out animation |
| */ |
| fadeInOutAnimation: Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["trigger"])('fadeInOut', [Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["state"])('in', Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["style"])({ |
| opacity: 1 |
| })), Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('void => *', [Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["style"])({ |
| opacity: 0 |
| }), Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["animate"])('0.5s 0.1s ease-in')]), Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('* => void', Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["animate"])('0.5s ease-out', Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["style"])({ |
| opacity: 0 |
| })))]) |
| }; |
| /* harmony default export */ __webpack_exports__["default"] = (new FdsAnimations()); |
| |
| /***/ }), |
| |
| /***/ "./platform/core/common/services/fds-storage.service.js": |
| /*!**************************************************************!*\ |
| !*** ./platform/core/common/services/fds-storage.service.js ***! |
| \**************************************************************/ |
| /*! exports provided: default */ |
| /***/ (function(module, __webpack_exports__, __webpack_require__) { |
| |
| "use strict"; |
| __webpack_require__.r(__webpack_exports__); |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| // Store items for two days before being eligible for removal. |
| var MILLIS_PER_DAY = 86400000; |
| var TWO_DAYS = MILLIS_PER_DAY * 2; |
| |
| var isUndefined = function isUndefined(obj) { |
| return typeof obj === 'undefined'; |
| }; |
| |
| var isNull = function isNull(obj) { |
| return obj === null; |
| }; |
| |
| var isDefinedAndNotNull = function isDefinedAndNotNull(obj) { |
| return !isUndefined(obj) && !isNull(obj); |
| }; |
| /** |
| * Checks the expiration for the specified entry. |
| * |
| * @param {object} entry |
| * @returns {boolean} |
| */ |
| |
| |
| var checkExpiration = function checkExpiration(entry) { |
| if (isDefinedAndNotNull(entry.expires)) { |
| // get the expiration |
| var expires = new Date(entry.expires); |
| var now = new Date(); // return whether the expiration date has passed |
| |
| return expires.valueOf() < now.valueOf(); |
| } |
| |
| return false; |
| }; |
| /** |
| * Gets an enty for the key. The entry expiration is not checked. |
| * |
| * @param {string} key |
| */ |
| |
| |
| var getEntry = function getEntry(key) { |
| try { |
| // parse the entry |
| var entry = JSON.parse(localStorage.getItem(key)); // ensure the entry and item are present |
| |
| if (isDefinedAndNotNull(entry)) { |
| return entry; |
| } |
| |
| return null; |
| } catch (e) { |
| return null; |
| } |
| }; |
| /** |
| * FdsStorageService constructor. |
| * @constructor |
| */ |
| |
| |
| function FdsStorageService() {} |
| |
| FdsStorageService.prototype = { |
| constructor: FdsStorageService, |
| |
| /** |
| * Initializes the storage. Items will be persisted for two days. Once the scripts runs |
| * thereafter, all eligible items will be removed. This strategy does not support persistence. |
| */ |
| init: function init() { |
| for (var i = 0; i < localStorage.length; i++) { |
| try { |
| // get the next item |
| var key = localStorage.key(i); // attempt to get the item which will expire if necessary |
| |
| this.getItem(key); |
| } catch (e) {// Do nothing |
| } |
| } |
| }, |
| |
| /** |
| * Stores the specified item. |
| * |
| * @param {string} key |
| * @param {object} item |
| * @param {integer} expires |
| */ |
| setItem: function setItem(key, item, expires) { |
| // calculate the expiration |
| expires = isDefinedAndNotNull(expires) ? expires : new Date().valueOf() + TWO_DAYS; // create the entry |
| |
| var entry = { |
| expires: expires, |
| item: item |
| }; // store the item |
| |
| localStorage.setItem(key, JSON.stringify(entry)); |
| }, |
| |
| /** |
| * Returns whether there is an entry for this key. This will not check the expiration. If |
| * the entry is expired, it will return null on a subsequent getItem invocation. |
| * |
| * @param {string} key |
| * @returns {boolean} |
| */ |
| hasItem: function hasItem(key) { |
| return getEntry(key) !== null; |
| }, |
| |
| /** |
| * Gets the item with the specified key. If an item with this key does |
| * not exist, null is returned. If an item exists but cannot be parsed |
| * or is malformed/unrecognized, null is returned. |
| * |
| * @param {type} key |
| */ |
| getItem: function getItem(key) { |
| var entry = getEntry(key); |
| |
| if (entry === null) { |
| return null; |
| } // if the entry is expired, drop it and return null |
| |
| |
| if (checkExpiration(entry)) { |
| this.removeItem(key); |
| return null; |
| } // if the entry has the specified field return its value |
| |
| |
| if (isDefinedAndNotNull(entry['item'])) { |
| return entry['item']; |
| } |
| |
| return null; |
| }, |
| |
| /** |
| * Gets the expiration for the specified item. This will not check the expiration. If |
| * the entry is expired, it will return null on a subsequent getItem invocation. |
| * |
| * @param {string} key |
| * @returns {integer} |
| */ |
| getItemExpiration: function getItemExpiration(key) { |
| var entry = getEntry(key); |
| |
| if (entry === null) { |
| return null; |
| } // if the entry has the specified field return its value |
| |
| |
| if (isDefinedAndNotNull(entry['expires'])) { |
| return entry['expires']; |
| } |
| |
| return null; |
| }, |
| |
| /** |
| * Extracts the subject from the specified jwt. If the jwt is not as expected |
| * an empty string is returned. |
| * |
| * @param {string} jwt |
| * @returns {string} |
| */ |
| getJwtPayload: function getJwtPayload(jwt) { |
| if (isDefinedAndNotNull(jwt)) { |
| var segments = jwt.split(/\./); |
| |
| if (segments.length !== 3) { |
| return ''; |
| } |
| |
| var rawPayload = window.atob(segments[1]); |
| var payload = JSON.parse(rawPayload); |
| |
| if (isDefinedAndNotNull(payload)) { |
| return payload; |
| } |
| |
| return null; |
| } |
| |
| return null; |
| }, |
| |
| /** |
| * Removes the item with the specified key. |
| * |
| * @param {type} key |
| */ |
| removeItem: function removeItem(key) { |
| localStorage.removeItem(key); |
| } |
| }; |
| FdsStorageService.parameters = []; |
| /* harmony default export */ __webpack_exports__["default"] = (FdsStorageService); |
| |
| /***/ }), |
| |
| /***/ "./platform/core/dialogs/confirm-dialog/confirm-dialog.component.html": |
| /*!****************************************************************************!*\ |
| !*** ./platform/core/dialogs/confirm-dialog/confirm-dialog.component.html ***! |
| \****************************************************************************/ |
| /*! no static exports found */ |
| /***/ (function(module, exports) { |
| |
| module.exports = "<!--\nLicensed to the Apache Software Foundation (ASF) under one or more\ncontributor license agreements. See the NOTICE file distributed with\nthis work for additional information regarding copyright ownership.\nThe ASF licenses this file to You under the Apache License, Version 2.0\n(the \"License\"); you may not use this file except in compliance with\nthe License. You may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n-->\n\n<fds-dialog>\n <fds-dialog-title *ngIf=\"title\">\n <div fxLayout=\"row\" fxLayoutAlign=\"space-between center\">\n {{title}}\n <button mat-icon-button (click)=\"cancel()\">\n <mat-icon color=\"primary\">close</mat-icon>\n </button>\n </div>\n </fds-dialog-title>\n <fds-dialog-content class=\"md-subhead tc-grey-700\">\n {{message}}\n </fds-dialog-content>\n <fds-dialog-actions>\n <button *ngIf=\"cancelButton\" mat-raised-button\n color=\"{{cancelButtonColor}}\"\n #closeBtn\n (keydown.arrowright)=\"acceptBtn.focus()\"\n (click)=\"cancel()\">{{cancelButton}}\n </button>\n <button *ngIf=\"acceptButton\" mat-raised-button\n color=\"{{acceptButtonColor}}\"\n #acceptBtn\n (keydown.arrowleft)=\"closeBtn.focus()\"\n (click)=\"accept()\"\n class=\"push-left-sm\">{{acceptButton}}\n </button>\n </fds-dialog-actions>\n</fds-dialog>"; |
| |
| /***/ }), |
| |
| /***/ "./platform/core/dialogs/confirm-dialog/confirm-dialog.component.js": |
| /*!**************************************************************************!*\ |
| !*** ./platform/core/dialogs/confirm-dialog/confirm-dialog.component.js ***! |
| \**************************************************************************/ |
| /*! exports provided: FdsConfirmDialogComponent */ |
| /***/ (function(module, __webpack_exports__, __webpack_require__) { |
| |
| "use strict"; |
| __webpack_require__.r(__webpack_exports__); |
| /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FdsConfirmDialogComponent", function() { return FdsConfirmDialogComponent; }); |
| /* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js"); |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /** |
| * FdsConfirmDialogComponent constructor. |
| * |
| * @constructor |
| */ |
| |
| function FdsConfirmDialogComponent() { |
| this.title = ''; |
| this.message = ''; |
| this.acceptButton = ''; |
| this.acceptButtonColor = 'fds-primary'; |
| this.cancelButton = ''; |
| this.cancelButtonColor = 'fds-regular'; |
| this.dialogRef = undefined; |
| this.viewContainerRef = undefined; |
| this.disableClose = true; |
| } |
| |
| FdsConfirmDialogComponent.prototype = { |
| constructor: FdsConfirmDialogComponent, |
| |
| /** |
| * Close the dialog and send a cancel response to any subscribers. |
| */ |
| cancel: function cancel() { |
| this.dialogRef.close(false); |
| }, |
| |
| /** |
| * Close the dialog and send an accept response to any subscribers. |
| */ |
| accept: function accept() { |
| this.dialogRef.close(true); |
| } |
| }; |
| FdsConfirmDialogComponent.annotations = [new _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"]({ |
| selector: 'fds-confirm-dialog', |
| template: __webpack_require__(/*! ./confirm-dialog.component.html */ "./platform/core/dialogs/confirm-dialog/confirm-dialog.component.html")})]; |
| FdsConfirmDialogComponent.parameters = []; |
| |
| |
| /***/ }), |
| |
| /***/ "./platform/core/dialogs/fds-dialog.component.html": |
| /*!*********************************************************!*\ |
| !*** ./platform/core/dialogs/fds-dialog.component.html ***! |
| \*********************************************************/ |
| /*! no static exports found */ |
| /***/ (function(module, exports) { |
| |
| module.exports = "<!--\nLicensed to the Apache Software Foundation (ASF) under one or more\ncontributor license agreements. See the NOTICE file distributed with\nthis work for additional information regarding copyright ownership.\nThe ASF licenses this file to You under the Apache License, Version 2.0\n(the \"License\"); you may not use this file except in compliance with\nthe License. You may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n-->\n\n<div class=\"fds-dialog-wrapper\">\n <h3 class=\"fds-dialog-title md-title\" *ngIf=\"dialogTitle.length > 0\">\n <ng-content select=\"fds-dialog-title\"></ng-content>\n </h3>\n <div class=\"fds-dialog-content pad-bottom-md\" *ngIf=\"dialogContent.length > 0\">\n <ng-content select=\"fds-dialog-content\"></ng-content>\n </div>\n <div class=\"fds-dialog-actions\" *ngIf=\"dialogActions.length > 0\" layout=\"row\">\n <span flex></span>\n <ng-content select=\"fds-dialog-actions\"></ng-content>\n </div>\n</div>\n"; |
| |
| /***/ }), |
| |
| /***/ "./platform/core/dialogs/fds-dialog.component.js": |
| /*!*******************************************************!*\ |
| !*** ./platform/core/dialogs/fds-dialog.component.js ***! |
| \*******************************************************/ |
| /*! exports provided: FdsDialogTitleDirective, FdsDialogContentDirective, FdsDialogActionsDirective, FdsDialogComponent */ |
| /***/ (function(module, __webpack_exports__, __webpack_require__) { |
| |
| "use strict"; |
| __webpack_require__.r(__webpack_exports__); |
| /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FdsDialogTitleDirective", function() { return FdsDialogTitleDirective; }); |
| /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FdsDialogContentDirective", function() { return FdsDialogContentDirective; }); |
| /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FdsDialogActionsDirective", function() { return FdsDialogActionsDirective; }); |
| /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FdsDialogComponent", function() { return FdsDialogComponent; }); |
| /* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js"); |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| function FdsDialogTitleDirective() {} |
| FdsDialogTitleDirective.prototype = { |
| contstructor: FdsDialogTitleDirective |
| }; |
| FdsDialogTitleDirective.decorators = [{ |
| type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"], |
| args: [{ |
| selector: 'fds-dialog-title' |
| }] |
| }]; |
| function FdsDialogContentDirective() {} |
| FdsDialogContentDirective.prototype = { |
| contstructor: FdsDialogContentDirective |
| }; |
| FdsDialogContentDirective.decorators = [{ |
| type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"], |
| args: [{ |
| selector: 'fds-dialog-content' |
| }] |
| }]; |
| function FdsDialogActionsDirective() {} |
| FdsDialogActionsDirective.prototype = { |
| contstructor: FdsDialogActionsDirective |
| }; |
| FdsDialogActionsDirective.decorators = [{ |
| type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"], |
| args: [{ |
| selector: 'fds-dialog-actions' |
| }] |
| }]; |
| /** |
| * FdsDialogComponent constructor |
| * |
| * @constructor |
| */ |
| |
| function FdsDialogComponent() { |
| this.dialogTitle = ''; |
| this.dialogContent = ''; |
| this.dialogActions = ''; |
| } |
| |
| FdsDialogComponent.prototype = { |
| constructor: FdsDialogComponent, |
| |
| /** |
| * Respond after Angular projects external content into the component's view. |
| */ |
| ngAfterContentInit: function ngAfterContentInit() { |
| if (this.dialogTitle.length > 1) { |
| throw new Error('Duplicate fds-dialog-title component at in fds-dialog.'); |
| } |
| |
| if (this.dialogContent.length > 1) { |
| throw new Error('Duplicate fds-dialog-content component at in fds-dialog.'); |
| } |
| |
| if (this.dialogActions.length > 1) { |
| throw new Error('Duplicate fds-dialog-actions component at in fds-dialog.'); |
| } |
| } |
| }; |
| FdsDialogComponent.annotations = [new _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"]({ |
| selector: 'fds-dialog', |
| template: __webpack_require__(/*! ./fds-dialog.component.html */ "./platform/core/dialogs/fds-dialog.component.html"), |
| queries: { |
| dialogTitle: new _angular_core__WEBPACK_IMPORTED_MODULE_0__["ContentChildren"](FdsDialogTitleDirective), |
| dialogContent: new _angular_core__WEBPACK_IMPORTED_MODULE_0__["ContentChildren"](FdsDialogContentDirective), |
| dialogActions: new _angular_core__WEBPACK_IMPORTED_MODULE_0__["ContentChildren"](FdsDialogActionsDirective) |
| } |
| })]; |
| FdsDialogComponent.parameters = []; |
| |
| |
| /***/ }), |
| |
| /***/ "./platform/core/dialogs/fds-dialogs.module.js": |
| /*!*****************************************************!*\ |
| !*** ./platform/core/dialogs/fds-dialogs.module.js ***! |
| \*****************************************************/ |
| /*! exports provided: FdsDialogsModule, IConfirmConfig, FdsDialogService, FdsDialogComponent, FdsDialogTitleDirective, FdsDialogContentDirective, FdsDialogActionsDirective, FdsConfirmDialogComponent */ |
| /***/ (function(module, __webpack_exports__, __webpack_require__) { |
| |
| "use strict"; |
| __webpack_require__.r(__webpack_exports__); |
| /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FdsDialogsModule", function() { return FdsDialogsModule; }); |
| /* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js"); |
| /* harmony import */ var _angular_flex_layout__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/flex-layout */ "./node_modules/@angular/flex-layout/esm5/flex-layout.es5.js"); |
| /* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/fesm5/common.js"); |
| /* harmony import */ var _angular_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @angular/material */ "./node_modules/@angular/material/esm5/material.es5.js"); |
| /* harmony import */ var _angular_forms__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @angular/forms */ "./node_modules/@angular/forms/fesm5/forms.js"); |
| /* harmony import */ var _fds_dialog_component__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./fds-dialog.component */ "./platform/core/dialogs/fds-dialog.component.js"); |
| /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsDialogComponent", function() { return _fds_dialog_component__WEBPACK_IMPORTED_MODULE_5__["FdsDialogComponent"]; }); |
| |
| /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsDialogTitleDirective", function() { return _fds_dialog_component__WEBPACK_IMPORTED_MODULE_5__["FdsDialogTitleDirective"]; }); |
| |
| /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsDialogContentDirective", function() { return _fds_dialog_component__WEBPACK_IMPORTED_MODULE_5__["FdsDialogContentDirective"]; }); |
| |
| /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsDialogActionsDirective", function() { return _fds_dialog_component__WEBPACK_IMPORTED_MODULE_5__["FdsDialogActionsDirective"]; }); |
| |
| /* harmony import */ var _services_dialog_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./services/dialog.service */ "./platform/core/dialogs/services/dialog.service.js"); |
| /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "IConfirmConfig", function() { return _services_dialog_service__WEBPACK_IMPORTED_MODULE_6__["IConfirmConfig"]; }); |
| |
| /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsDialogService", function() { return _services_dialog_service__WEBPACK_IMPORTED_MODULE_6__["FdsDialogService"]; }); |
| |
| /* harmony import */ var _confirm_dialog_confirm_dialog_component__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./confirm-dialog/confirm-dialog.component */ "./platform/core/dialogs/confirm-dialog/confirm-dialog.component.js"); |
| /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsConfirmDialogComponent", function() { return _confirm_dialog_confirm_dialog_component__WEBPACK_IMPORTED_MODULE_7__["FdsConfirmDialogComponent"]; }); |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| |
| |
| |
| |
| |
| |
| |
| var FDS_DIALOGS = [_fds_dialog_component__WEBPACK_IMPORTED_MODULE_5__["FdsDialogComponent"], _fds_dialog_component__WEBPACK_IMPORTED_MODULE_5__["FdsDialogTitleDirective"], _fds_dialog_component__WEBPACK_IMPORTED_MODULE_5__["FdsDialogActionsDirective"], _fds_dialog_component__WEBPACK_IMPORTED_MODULE_5__["FdsDialogContentDirective"], _confirm_dialog_confirm_dialog_component__WEBPACK_IMPORTED_MODULE_7__["FdsConfirmDialogComponent"]]; |
| var FDS_DIALOGS_ENTRY_COMPONENTS = [_confirm_dialog_confirm_dialog_component__WEBPACK_IMPORTED_MODULE_7__["FdsConfirmDialogComponent"]]; |
| /** |
| * FdsDialogsModule constructor. |
| * |
| * @constructor |
| */ |
| |
| function FdsDialogsModule() {} |
| |
| FdsDialogsModule.prototype = { |
| constructor: FdsDialogsModule |
| }; |
| FdsDialogsModule.annotations = [new _angular_core__WEBPACK_IMPORTED_MODULE_0__["NgModule"]({ |
| imports: [_angular_flex_layout__WEBPACK_IMPORTED_MODULE_1__["FlexLayoutModule"], _angular_forms__WEBPACK_IMPORTED_MODULE_4__["FormsModule"], _angular_common__WEBPACK_IMPORTED_MODULE_2__["CommonModule"], _angular_material__WEBPACK_IMPORTED_MODULE_3__["MatDialogModule"], _angular_material__WEBPACK_IMPORTED_MODULE_3__["MatInputModule"], _angular_material__WEBPACK_IMPORTED_MODULE_3__["MatButtonModule"], _angular_material__WEBPACK_IMPORTED_MODULE_3__["MatIconModule"]], |
| declarations: [FDS_DIALOGS], |
| exports: [FDS_DIALOGS], |
| providers: [_services_dialog_service__WEBPACK_IMPORTED_MODULE_6__["FdsDialogService"]], |
| entryComponents: [FDS_DIALOGS_ENTRY_COMPONENTS] |
| })]; |
| |
| |
| /***/ }), |
| |
| /***/ "./platform/core/dialogs/services/dialog.service.js": |
| /*!**********************************************************!*\ |
| !*** ./platform/core/dialogs/services/dialog.service.js ***! |
| \**********************************************************/ |
| /*! exports provided: IDialogConfig, IConfirmConfig, FdsDialogService */ |
| /***/ (function(module, __webpack_exports__, __webpack_require__) { |
| |
| "use strict"; |
| __webpack_require__.r(__webpack_exports__); |
| /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "IDialogConfig", function() { return IDialogConfig; }); |
| /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "IConfirmConfig", function() { return IConfirmConfig; }); |
| /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FdsDialogService", function() { return FdsDialogService; }); |
| /* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"); |
| /* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__); |
| /* harmony import */ var _angular_material__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/material */ "./node_modules/@angular/material/esm5/material.es5.js"); |
| /* harmony import */ var _confirm_dialog_confirm_dialog_component__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../confirm-dialog/confirm-dialog.component */ "./platform/core/dialogs/confirm-dialog/confirm-dialog.component.js"); |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| |
| |
| |
| function IDialogConfig() { |
| this.title = ''; |
| this.message = ''; |
| this.dialogRef = undefined; |
| this.viewContainerRef = undefined; |
| this.disableClose = true; |
| } |
| |
| IDialogConfig.prototype = { |
| contstructor: IDialogConfig |
| }; |
| jquery__WEBPACK_IMPORTED_MODULE_0___default.a.extend(IDialogConfig, _angular_material__WEBPACK_IMPORTED_MODULE_1__["MatDialogConfig"]); |
| |
| function IConfirmConfig() { |
| this.acceptButton = 'ACCEPT'; |
| this.acceptButtonColor = 'fds-primary'; |
| this.cancelButton = 'CANCEL'; |
| this.cancelButtonColor = 'fds-secondary'; |
| } |
| |
| IConfirmConfig.prototype = { |
| contstructor: IConfirmConfig |
| }; |
| jquery__WEBPACK_IMPORTED_MODULE_0___default.a.extend(IConfirmConfig, IDialogConfig); |
| |
| function createConfig(config) { |
| var dialogConfig = new IConfirmConfig(); |
| dialogConfig.viewContainerRef = config.viewContainerRef; |
| dialogConfig.disableClose = config.disableClose; |
| return dialogConfig; |
| } |
| /** |
| * FdsDialogService constructor. |
| * |
| * @param MatDialog The angular material MatDialog. |
| * @constructor |
| */ |
| |
| |
| function FdsDialogService(MatDialog) { |
| this.dialogService = MatDialog; |
| } |
| |
| FdsDialogService.prototype = { |
| contstructor: FdsDialogService, |
| |
| /** |
| * Wrapper function over the open() method in MatDialog. |
| * Opens a modal dialog containing the given component. |
| * |
| * @param component The angular ComponentType<T>. |
| * @param config The angular material MatDialogConfig. |
| * |
| * @returns {MatDialoRef} The reference to the dialog. |
| */ |
| open: function open(component, config) { |
| return this.dialogService.open(component, config); |
| }, |
| |
| /** |
| * Wrapper function over the closeAll() method in MatDialog. |
| * Closes all of the currently-open dialogs. |
| */ |
| closeAll: function closeAll() { |
| this.dialogService.closeAll(); |
| }, |
| |
| /** |
| * Opens a confirm dialog with the provided config. |
| * |
| * @param config IConfirmConfig { |
| * message?: string; |
| * title?: string; |
| * dialogRef?: MatDialoRef; |
| * viewContainerRef?: ViewContainerRef; |
| * disableClose?: boolean; |
| * acceptButton?: string; |
| * acceptButtonColor?: string; |
| * cancelButton?: string; |
| * cancelButtonColor?: string; |
| * } |
| * |
| * @returns {MatDialoRef} The reference to the dialog. |
| */ |
| openConfirm: function openConfirm(config) { |
| var dialogConfig = createConfig(config); |
| var dialogRef = this.dialogService.open(_confirm_dialog_confirm_dialog_component__WEBPACK_IMPORTED_MODULE_2__["FdsConfirmDialogComponent"], dialogConfig); |
| var confirmDialogComponent = dialogRef.componentInstance; |
| confirmDialogComponent.dialogRef = dialogRef; |
| |
| if (config.title) { |
| confirmDialogComponent.title = config.title; |
| } |
| |
| if (config.message) { |
| confirmDialogComponent.message = config.message; |
| } |
| |
| if (config.acceptButton) { |
| confirmDialogComponent.acceptButton = config.acceptButton; |
| } |
| |
| if (config.acceptButtonColor) { |
| confirmDialogComponent.acceptButtonColor = config.acceptButtonColor; |
| } |
| |
| if (config.cancelButton) { |
| confirmDialogComponent.cancelButton = config.cancelButton; |
| } |
| |
| if (config.cancelButtonColor) { |
| confirmDialogComponent.cancelButtonColor = config.cancelButtonColor; |
| } |
| |
| return dialogRef; |
| } |
| }; |
| FdsDialogService.parameters = [_angular_material__WEBPACK_IMPORTED_MODULE_1__["MatDialog"]]; |
| |
| |
| /***/ }), |
| |
| /***/ "./platform/core/flow-design-system.module.js": |
| /*!****************************************************!*\ |
| !*** ./platform/core/flow-design-system.module.js ***! |
| \****************************************************/ |
| /*! exports provided: default */ |
| /***/ (function(module, __webpack_exports__, __webpack_require__) { |
| |
| "use strict"; |
| __webpack_require__.r(__webpack_exports__); |
| /* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"); |
| /* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__); |
| /* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js"); |
| /* harmony import */ var _angular_flex_layout__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @angular/flex-layout */ "./node_modules/@angular/flex-layout/esm5/flex-layout.es5.js"); |
| /* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/fesm5/common.js"); |
| /* harmony import */ var _angular_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @angular/material */ "./node_modules/@angular/material/esm5/material.es5.js"); |
| /* harmony import */ var _angular_platform_browser__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @angular/platform-browser */ "./node_modules/@angular/platform-browser/fesm5/platform-browser.js"); |
| /* harmony import */ var _angular_platform_browser_animations__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @angular/platform-browser/animations */ "./node_modules/@angular/platform-browser/fesm5/animations.js"); |
| /* harmony import */ var _covalent_core__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @covalent/core */ "./node_modules/@covalent/core/fesm5/covalent-core.js"); |
| /* harmony import */ var _covalent_core_steps__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @covalent/core/steps */ "./node_modules/@covalent/core/fesm5/covalent-core-steps.js"); |
| /* harmony import */ var _covalent_core_data_table__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @covalent/core/data-table */ "./node_modules/@covalent/core/fesm5/covalent-core-data-table.js"); |
| /* harmony import */ var _dialogs_fds_dialogs_module__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./dialogs/fds-dialogs.module */ "./platform/core/dialogs/fds-dialogs.module.js"); |
| /* harmony import */ var _snackbars_fds_snackbars_module__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./snackbars/fds-snackbars.module */ "./platform/core/snackbars/fds-snackbars.module.js"); |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| /** |
| * FlowDesignSystemModule constructor. |
| * |
| * @constructor |
| */ |
| |
| function FlowDesignSystemModule() { |
| jquery__WEBPACK_IMPORTED_MODULE_0___default()(document).ready(function () { |
| //add fds attr to body tag to allow fine grain style overrides |
| document.body.setAttribute('fds', ''); //override the hover styles for checkbox borders |
| |
| jquery__WEBPACK_IMPORTED_MODULE_0___default()(document.body).on('mouseenter', '.mat-checkbox-inner-container', function () { |
| jquery__WEBPACK_IMPORTED_MODULE_0___default()(this).find('.mat-checkbox-frame').css('border-color', '#1491C1'); |
| }); |
| jquery__WEBPACK_IMPORTED_MODULE_0___default()(document.body).on('mouseleave', '.mat-checkbox-inner-container', function () { |
| jquery__WEBPACK_IMPORTED_MODULE_0___default()(this).find('.mat-checkbox-frame').css('border-color', '#DDDDDD'); |
| }); |
| }); |
| } |
| |
| FlowDesignSystemModule.prototype = { |
| constructor: FlowDesignSystemModule |
| }; |
| FlowDesignSystemModule.annotations = [new _angular_core__WEBPACK_IMPORTED_MODULE_1__["NgModule"]({ |
| imports: [_angular_flex_layout__WEBPACK_IMPORTED_MODULE_2__["FlexLayoutModule"], _angular_platform_browser_animations__WEBPACK_IMPORTED_MODULE_6__["BrowserAnimationsModule"], _angular_common__WEBPACK_IMPORTED_MODULE_3__["CommonModule"], _angular_platform_browser__WEBPACK_IMPORTED_MODULE_5__["BrowserModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatAutocompleteModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatButtonModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatButtonToggleModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatCardModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatCheckboxModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatChipsModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatDatepickerModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatDialogModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatExpansionModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatFormFieldModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatGridListModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatIconModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatInputModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatListModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatMenuModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatProgressBarModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatProgressSpinnerModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatRadioModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatSelectModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatSlideToggleModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatSliderModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatSidenavModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatSnackBarModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatStepperModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatTabsModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatToolbarModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatTooltipModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatPaginatorModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatSortModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatTableModule"], _covalent_core__WEBPACK_IMPORTED_MODULE_7__["CovalentCommonModule"], _covalent_core__WEBPACK_IMPORTED_MODULE_7__["CovalentChipsModule"], _covalent_core_steps__WEBPACK_IMPORTED_MODULE_8__["CovalentStepsModule"], _covalent_core_data_table__WEBPACK_IMPORTED_MODULE_9__["CovalentDataTableModule"], _covalent_core__WEBPACK_IMPORTED_MODULE_7__["CovalentDialogsModule"], _covalent_core__WEBPACK_IMPORTED_MODULE_7__["CovalentExpansionPanelModule"], _covalent_core__WEBPACK_IMPORTED_MODULE_7__["CovalentPagingModule"], _dialogs_fds_dialogs_module__WEBPACK_IMPORTED_MODULE_10__["FdsDialogsModule"], _snackbars_fds_snackbars_module__WEBPACK_IMPORTED_MODULE_11__["FdsSnackBarsModule"]], |
| exports: [_angular_flex_layout__WEBPACK_IMPORTED_MODULE_2__["FlexLayoutModule"], _angular_platform_browser_animations__WEBPACK_IMPORTED_MODULE_6__["BrowserAnimationsModule"], _angular_common__WEBPACK_IMPORTED_MODULE_3__["CommonModule"], _angular_platform_browser__WEBPACK_IMPORTED_MODULE_5__["BrowserModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatAutocompleteModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatButtonModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatButtonToggleModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatCardModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatCheckboxModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatChipsModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatDatepickerModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatDialogModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatExpansionModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatFormFieldModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatGridListModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatIconModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatInputModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatListModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatMenuModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatProgressBarModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatProgressSpinnerModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatRadioModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatSelectModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatSlideToggleModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatSliderModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatSidenavModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatSnackBarModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatStepperModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatTabsModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatToolbarModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatTooltipModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatPaginatorModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatSortModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatTableModule"], _covalent_core__WEBPACK_IMPORTED_MODULE_7__["CovalentCommonModule"], _covalent_core__WEBPACK_IMPORTED_MODULE_7__["CovalentChipsModule"], _covalent_core_steps__WEBPACK_IMPORTED_MODULE_8__["CovalentStepsModule"], _covalent_core_data_table__WEBPACK_IMPORTED_MODULE_9__["CovalentDataTableModule"], _covalent_core__WEBPACK_IMPORTED_MODULE_7__["CovalentDialogsModule"], _covalent_core__WEBPACK_IMPORTED_MODULE_7__["CovalentExpansionPanelModule"], _covalent_core__WEBPACK_IMPORTED_MODULE_7__["CovalentPagingModule"], _dialogs_fds_dialogs_module__WEBPACK_IMPORTED_MODULE_10__["FdsDialogsModule"], _snackbars_fds_snackbars_module__WEBPACK_IMPORTED_MODULE_11__["FdsSnackBarsModule"]] |
| })]; |
| /* harmony default export */ __webpack_exports__["default"] = (FlowDesignSystemModule); |
| |
| /***/ }), |
| |
| /***/ "./platform/core/index.js": |
| /*!********************************!*\ |
| !*** ./platform/core/index.js ***! |
| \********************************/ |
| /*! exports provided: FdsDialogsModule, FdsConfirmDialogComponent, FdsDialogActionsDirective, FdsDialogComponent, FdsDialogContentDirective, FdsDialogService, FdsDialogTitleDirective, IConfirmConfig, FdsCommonsModule, FdsStorageService, FdsAnimations, FdsCoasterComponent, FdsSnackBarActionsDirective, FdsSnackBarComponent, FdsSnackBarContentDirective, FdsSnackBarService, FdsSnackBarsModule, FdsSnackBarTitleDirective, ICoasterConfig, FdsCoreModule */ |
| /***/ (function(module, __webpack_exports__, __webpack_require__) { |
| |
| "use strict"; |
| __webpack_require__.r(__webpack_exports__); |
| /* harmony import */ var _dialogs_fds_dialogs_module__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./dialogs/fds-dialogs.module */ "./platform/core/dialogs/fds-dialogs.module.js"); |
| /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsDialogsModule", function() { return _dialogs_fds_dialogs_module__WEBPACK_IMPORTED_MODULE_0__["FdsDialogsModule"]; }); |
| |
| /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsConfirmDialogComponent", function() { return _dialogs_fds_dialogs_module__WEBPACK_IMPORTED_MODULE_0__["FdsConfirmDialogComponent"]; }); |
| |
| /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsDialogActionsDirective", function() { return _dialogs_fds_dialogs_module__WEBPACK_IMPORTED_MODULE_0__["FdsDialogActionsDirective"]; }); |
| |
| /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsDialogComponent", function() { return _dialogs_fds_dialogs_module__WEBPACK_IMPORTED_MODULE_0__["FdsDialogComponent"]; }); |
| |
| /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsDialogContentDirective", function() { return _dialogs_fds_dialogs_module__WEBPACK_IMPORTED_MODULE_0__["FdsDialogContentDirective"]; }); |
| |
| /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsDialogService", function() { return _dialogs_fds_dialogs_module__WEBPACK_IMPORTED_MODULE_0__["FdsDialogService"]; }); |
| |
| /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsDialogTitleDirective", function() { return _dialogs_fds_dialogs_module__WEBPACK_IMPORTED_MODULE_0__["FdsDialogTitleDirective"]; }); |
| |
| /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "IConfirmConfig", function() { return _dialogs_fds_dialogs_module__WEBPACK_IMPORTED_MODULE_0__["IConfirmConfig"]; }); |
| |
| /* harmony import */ var _common_fds_common_module__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./common/fds-common.module */ "./platform/core/common/fds-common.module.js"); |
| /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsCommonsModule", function() { return _common_fds_common_module__WEBPACK_IMPORTED_MODULE_1__["FdsCommonsModule"]; }); |
| |
| /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsStorageService", function() { return _common_fds_common_module__WEBPACK_IMPORTED_MODULE_1__["FdsStorageService"]; }); |
| |
| /* harmony import */ var _common_fds_animations__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./common/fds.animations */ "./platform/core/common/fds.animations.js"); |
| /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsAnimations", function() { return _common_fds_animations__WEBPACK_IMPORTED_MODULE_2__["default"]; }); |
| |
| /* harmony import */ var _snackbars_fds_snackbars_module__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./snackbars/fds-snackbars.module */ "./platform/core/snackbars/fds-snackbars.module.js"); |
| /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsCoasterComponent", function() { return _snackbars_fds_snackbars_module__WEBPACK_IMPORTED_MODULE_3__["FdsCoasterComponent"]; }); |
| |
| /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsSnackBarActionsDirective", function() { return _snackbars_fds_snackbars_module__WEBPACK_IMPORTED_MODULE_3__["FdsSnackBarActionsDirective"]; }); |
| |
| /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsSnackBarComponent", function() { return _snackbars_fds_snackbars_module__WEBPACK_IMPORTED_MODULE_3__["FdsSnackBarComponent"]; }); |
| |
| /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsSnackBarContentDirective", function() { return _snackbars_fds_snackbars_module__WEBPACK_IMPORTED_MODULE_3__["FdsSnackBarContentDirective"]; }); |
| |
| /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsSnackBarService", function() { return _snackbars_fds_snackbars_module__WEBPACK_IMPORTED_MODULE_3__["FdsSnackBarService"]; }); |
| |
| /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsSnackBarsModule", function() { return _snackbars_fds_snackbars_module__WEBPACK_IMPORTED_MODULE_3__["FdsSnackBarsModule"]; }); |
| |
| /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsSnackBarTitleDirective", function() { return _snackbars_fds_snackbars_module__WEBPACK_IMPORTED_MODULE_3__["FdsSnackBarTitleDirective"]; }); |
| |
| /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ICoasterConfig", function() { return _snackbars_fds_snackbars_module__WEBPACK_IMPORTED_MODULE_3__["ICoasterConfig"]; }); |
| |
| /* harmony import */ var _flow_design_system_module__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./flow-design-system.module */ "./platform/core/flow-design-system.module.js"); |
| /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsCoreModule", function() { return _flow_design_system_module__WEBPACK_IMPORTED_MODULE_4__["default"]; }); |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| |
| |
| |
| |
| |
| |
| /***/ }), |
| |
| /***/ "./platform/core/snackbars/coaster/coaster.component.html": |
| /*!****************************************************************!*\ |
| !*** ./platform/core/snackbars/coaster/coaster.component.html ***! |
| \****************************************************************/ |
| /*! no static exports found */ |
| /***/ (function(module, exports) { |
| |
| module.exports = "<!--\nLicensed to the Apache Software Foundation (ASF) under one or more\ncontributor license agreements. See the NOTICE file distributed with\nthis work for additional information regarding copyright ownership.\nThe ASF licenses this file to You under the Apache License, Version 2.0\n(the \"License\"); you may not use this file except in compliance with\nthe License. You may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n-->\n\n<fds-snackbar>\n <fds-snackbar-title *ngIf=\"title\">\n <button class=\"coaster-close-icon\" mat-icon-button (click)=\"cancel()\">\n <mat-icon color=\"primary\">close</mat-icon>\n </button>\n <i *ngIf=\"icon\" class=\"{{icon}} fds-coaster-icon\" aria-hidden=\"true\"></i>\n <div class=\"ellipsis\" fxLayout=\"row\" title=\"{{title}}\" fxLayoutAlign=\"space-between center\">\n {{title}}\n </div>\n </fds-snackbar-title>\n <fds-snackbar-content title=\"{{message}}\" class=\"fds-coaster-message tc-grey-700\">\n {{message}}\n </fds-snackbar-content>\n <fds-snackbar-actions>\n </fds-snackbar-actions>\n</fds-snackbar>\n"; |
| |
| /***/ }), |
| |
| /***/ "./platform/core/snackbars/coaster/coaster.component.js": |
| /*!**************************************************************!*\ |
| !*** ./platform/core/snackbars/coaster/coaster.component.js ***! |
| \**************************************************************/ |
| /*! exports provided: FdsCoasterComponent */ |
| /***/ (function(module, __webpack_exports__, __webpack_require__) { |
| |
| "use strict"; |
| __webpack_require__.r(__webpack_exports__); |
| /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FdsCoasterComponent", function() { return FdsCoasterComponent; }); |
| /* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js"); |
| /* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"); |
| /* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_1__); |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| |
| /** |
| * FdsCoasterComponent constructor. |
| * |
| * @constructor |
| */ |
| |
| function FdsCoasterComponent() { |
| this.title = ''; |
| this.message = ''; |
| this.icon = ''; |
| this.color = ''; |
| this.snackBarRef = undefined; |
| this.viewContainerRef = undefined; |
| } |
| |
| FdsCoasterComponent.prototype = { |
| constructor: FdsCoasterComponent, |
| |
| /** |
| * Initialize the component. |
| */ |
| ngAfterViewChecked: function ngAfterViewChecked() { |
| jquery__WEBPACK_IMPORTED_MODULE_1___default()('.fds-snackbar-wrapper').css('border-color', this.color); |
| jquery__WEBPACK_IMPORTED_MODULE_1___default()('.fds-snackbar-title').css('color', this.color); |
| jquery__WEBPACK_IMPORTED_MODULE_1___default()('.fds-coaster-icon').css('color', this.color); |
| |
| if (this.icon) { |
| jquery__WEBPACK_IMPORTED_MODULE_1___default()('.fds-snackbar-wrapper').css('padding', '15px 15px 15px 45px'); |
| } else { |
| jquery__WEBPACK_IMPORTED_MODULE_1___default()('.fds-snackbar-wrapper').css('padding', '15px 15px 15px 15px'); |
| } |
| }, |
| |
| /** |
| * Close the snackbar and send a cancel response to any subscribers. |
| */ |
| cancel: function cancel() { |
| this.snackBarRef.dismiss(false); |
| } |
| }; |
| FdsCoasterComponent.annotations = [new _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"]({ |
| selector: 'fds-coaster', |
| template: __webpack_require__(/*! ./coaster.component.html */ "./platform/core/snackbars/coaster/coaster.component.html")})]; |
| FdsCoasterComponent.parameters = []; |
| |
| |
| /***/ }), |
| |
| /***/ "./platform/core/snackbars/fds-snackbar.component.html": |
| /*!*************************************************************!*\ |
| !*** ./platform/core/snackbars/fds-snackbar.component.html ***! |
| \*************************************************************/ |
| /*! no static exports found */ |
| /***/ (function(module, exports) { |
| |
| module.exports = "<!--\nLicensed to the Apache Software Foundation (ASF) under one or more\ncontributor license agreements. See the NOTICE file distributed with\nthis work for additional information regarding copyright ownership.\nThe ASF licenses this file to You under the Apache License, Version 2.0\n(the \"License\"); you may not use this file except in compliance with\nthe License. You may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n-->\n\n<div class=\"fds-snackbar-wrapper\">\n <div class=\"fds-snackbar-title\" *ngIf=\"snackBarTitle.length > 0\">\n <ng-content select=\"fds-snackbar-title\"></ng-content>\n </div>\n <div class=\"fds-snackbar-content\" *ngIf=\"snackBarContent.length > 0\">\n <ng-content select=\"fds-snackbar-content\"></ng-content>\n </div>\n <div class=\"fds-snackbar-actions\" *ngIf=\"snackBarActions.length > 0\" layout=\"row\">\n <span flex></span>\n <ng-content select=\"fds-snackbar-actions\"></ng-content>\n </div>\n</div>\n"; |
| |
| /***/ }), |
| |
| /***/ "./platform/core/snackbars/fds-snackbar.component.js": |
| /*!***********************************************************!*\ |
| !*** ./platform/core/snackbars/fds-snackbar.component.js ***! |
| \***********************************************************/ |
| /*! exports provided: FdsSnackBarTitleDirective, FdsSnackBarContentDirective, FdsSnackBarActionsDirective, FdsSnackBarComponent */ |
| /***/ (function(module, __webpack_exports__, __webpack_require__) { |
| |
| "use strict"; |
| __webpack_require__.r(__webpack_exports__); |
| /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FdsSnackBarTitleDirective", function() { return FdsSnackBarTitleDirective; }); |
| /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FdsSnackBarContentDirective", function() { return FdsSnackBarContentDirective; }); |
| /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FdsSnackBarActionsDirective", function() { return FdsSnackBarActionsDirective; }); |
| /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FdsSnackBarComponent", function() { return FdsSnackBarComponent; }); |
| /* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js"); |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| function FdsSnackBarTitleDirective() {} |
| FdsSnackBarTitleDirective.prototype = { |
| contstructor: FdsSnackBarTitleDirective |
| }; |
| FdsSnackBarTitleDirective.decorators = [{ |
| type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"], |
| args: [{ |
| selector: 'fds-snackbar-title' |
| }] |
| }]; |
| function FdsSnackBarContentDirective() {} |
| FdsSnackBarContentDirective.prototype = { |
| contstructor: FdsSnackBarContentDirective |
| }; |
| FdsSnackBarContentDirective.decorators = [{ |
| type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"], |
| args: [{ |
| selector: 'fds-snackbar-content' |
| }] |
| }]; |
| function FdsSnackBarActionsDirective() {} |
| FdsSnackBarActionsDirective.prototype = { |
| contstructor: FdsSnackBarActionsDirective |
| }; |
| FdsSnackBarActionsDirective.decorators = [{ |
| type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"], |
| args: [{ |
| selector: 'fds-snackbar-actions' |
| }] |
| }]; |
| /** |
| * FdsSnackBarComponent constructor |
| * |
| * @constructor |
| */ |
| |
| function FdsSnackBarComponent() { |
| this.snackBarTitle = ''; |
| this.snackBarContent = ''; |
| this.snackBarActions = ''; |
| } |
| |
| FdsSnackBarComponent.prototype = { |
| constructor: FdsSnackBarComponent, |
| |
| /** |
| * Respond after Angular projects external content into the component's view. |
| */ |
| ngAfterContentInit: function ngAfterContentInit() { |
| if (this.snackBarTitle.length > 1) { |
| throw new Error('Duplicate fds-snackbar-title component at in fds-snackbar.'); |
| } |
| |
| if (this.snackBarContent.length > 1) { |
| throw new Error('Duplicate fds-snackbar-content component at in fds-snackbar.'); |
| } |
| |
| if (this.snackBarActions.length > 1) { |
| throw new Error('Duplicate fds-snackbar-actions component at in fds-snackbar.'); |
| } |
| } |
| }; |
| FdsSnackBarComponent.annotations = [new _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"]({ |
| selector: 'fds-snackbar', |
| template: __webpack_require__(/*! ./fds-snackbar.component.html */ "./platform/core/snackbars/fds-snackbar.component.html"), |
| queries: { |
| snackBarTitle: new _angular_core__WEBPACK_IMPORTED_MODULE_0__["ContentChildren"](FdsSnackBarTitleDirective), |
| snackBarContent: new _angular_core__WEBPACK_IMPORTED_MODULE_0__["ContentChildren"](FdsSnackBarContentDirective), |
| snackBarActions: new _angular_core__WEBPACK_IMPORTED_MODULE_0__["ContentChildren"](FdsSnackBarActionsDirective) |
| } |
| })]; |
| FdsSnackBarComponent.parameters = []; |
| |
| |
| /***/ }), |
| |
| /***/ "./platform/core/snackbars/fds-snackbars.module.js": |
| /*!*********************************************************!*\ |
| !*** ./platform/core/snackbars/fds-snackbars.module.js ***! |
| \*********************************************************/ |
| /*! exports provided: FdsSnackBarsModule, ICoasterConfig, FdsSnackBarService, FdsSnackBarComponent, FdsSnackBarTitleDirective, FdsSnackBarContentDirective, FdsSnackBarActionsDirective, FdsCoasterComponent */ |
| /***/ (function(module, __webpack_exports__, __webpack_require__) { |
| |
| "use strict"; |
| __webpack_require__.r(__webpack_exports__); |
| /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FdsSnackBarsModule", function() { return FdsSnackBarsModule; }); |
| /* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js"); |
| /* harmony import */ var _angular_flex_layout__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/flex-layout */ "./node_modules/@angular/flex-layout/esm5/flex-layout.es5.js"); |
| /* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/fesm5/common.js"); |
| /* harmony import */ var _angular_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @angular/material */ "./node_modules/@angular/material/esm5/material.es5.js"); |
| /* harmony import */ var _angular_forms__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @angular/forms */ "./node_modules/@angular/forms/fesm5/forms.js"); |
| /* harmony import */ var _fds_snackbar_component__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./fds-snackbar.component */ "./platform/core/snackbars/fds-snackbar.component.js"); |
| /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsSnackBarComponent", function() { return _fds_snackbar_component__WEBPACK_IMPORTED_MODULE_5__["FdsSnackBarComponent"]; }); |
| |
| /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsSnackBarTitleDirective", function() { return _fds_snackbar_component__WEBPACK_IMPORTED_MODULE_5__["FdsSnackBarTitleDirective"]; }); |
| |
| /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsSnackBarContentDirective", function() { return _fds_snackbar_component__WEBPACK_IMPORTED_MODULE_5__["FdsSnackBarContentDirective"]; }); |
| |
| /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsSnackBarActionsDirective", function() { return _fds_snackbar_component__WEBPACK_IMPORTED_MODULE_5__["FdsSnackBarActionsDirective"]; }); |
| |
| /* harmony import */ var _services_snackbar_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./services/snackbar.service */ "./platform/core/snackbars/services/snackbar.service.js"); |
| /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ICoasterConfig", function() { return _services_snackbar_service__WEBPACK_IMPORTED_MODULE_6__["ICoasterConfig"]; }); |
| |
| /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsSnackBarService", function() { return _services_snackbar_service__WEBPACK_IMPORTED_MODULE_6__["FdsSnackBarService"]; }); |
| |
| /* harmony import */ var _coaster_coaster_component__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./coaster/coaster.component */ "./platform/core/snackbars/coaster/coaster.component.js"); |
| /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsCoasterComponent", function() { return _coaster_coaster_component__WEBPACK_IMPORTED_MODULE_7__["FdsCoasterComponent"]; }); |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| |
| |
| |
| |
| |
| |
| |
| var FDS_SNACKBARS = [_fds_snackbar_component__WEBPACK_IMPORTED_MODULE_5__["FdsSnackBarComponent"], _fds_snackbar_component__WEBPACK_IMPORTED_MODULE_5__["FdsSnackBarTitleDirective"], _fds_snackbar_component__WEBPACK_IMPORTED_MODULE_5__["FdsSnackBarActionsDirective"], _fds_snackbar_component__WEBPACK_IMPORTED_MODULE_5__["FdsSnackBarContentDirective"], _coaster_coaster_component__WEBPACK_IMPORTED_MODULE_7__["FdsCoasterComponent"]]; |
| var FDS_SNACKBARS_ENTRY_COMPONENTS = [_coaster_coaster_component__WEBPACK_IMPORTED_MODULE_7__["FdsCoasterComponent"]]; |
| /** |
| * FdsSnackBarsModule constructor. |
| * |
| * @constructor |
| */ |
| |
| function FdsSnackBarsModule() {} |
| |
| FdsSnackBarsModule.prototype = { |
| constructor: FdsSnackBarsModule |
| }; |
| FdsSnackBarsModule.annotations = [new _angular_core__WEBPACK_IMPORTED_MODULE_0__["NgModule"]({ |
| imports: [_angular_flex_layout__WEBPACK_IMPORTED_MODULE_1__["FlexLayoutModule"], _angular_forms__WEBPACK_IMPORTED_MODULE_4__["FormsModule"], _angular_common__WEBPACK_IMPORTED_MODULE_2__["CommonModule"], _angular_material__WEBPACK_IMPORTED_MODULE_3__["MatSnackBarModule"], _angular_material__WEBPACK_IMPORTED_MODULE_3__["MatInputModule"], _angular_material__WEBPACK_IMPORTED_MODULE_3__["MatButtonModule"], _angular_material__WEBPACK_IMPORTED_MODULE_3__["MatIconModule"]], |
| declarations: [FDS_SNACKBARS], |
| exports: [FDS_SNACKBARS], |
| providers: [_services_snackbar_service__WEBPACK_IMPORTED_MODULE_6__["FdsSnackBarService"]], |
| entryComponents: [FDS_SNACKBARS_ENTRY_COMPONENTS] |
| })]; |
| |
| |
| /***/ }), |
| |
| /***/ "./platform/core/snackbars/services/snackbar.service.js": |
| /*!**************************************************************!*\ |
| !*** ./platform/core/snackbars/services/snackbar.service.js ***! |
| \**************************************************************/ |
| /*! exports provided: ISnackBarConfig, ICoasterConfig, FdsSnackBarService */ |
| /***/ (function(module, __webpack_exports__, __webpack_require__) { |
| |
| "use strict"; |
| __webpack_require__.r(__webpack_exports__); |
| /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ISnackBarConfig", function() { return ISnackBarConfig; }); |
| /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ICoasterConfig", function() { return ICoasterConfig; }); |
| /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FdsSnackBarService", function() { return FdsSnackBarService; }); |
| /* harmony import */ var _angular_material__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/material */ "./node_modules/@angular/material/esm5/material.es5.js"); |
| /* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"); |
| /* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_1__); |
| /* harmony import */ var _coaster_coaster_component__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../coaster/coaster.component */ "./platform/core/snackbars/coaster/coaster.component.js"); |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| |
| |
| function ISnackBarConfig() { |
| this.title = ''; |
| this.message = ''; |
| this.snackBarRef = undefined; |
| this.viewContainerRef = undefined; |
| } |
| ISnackBarConfig.prototype = { |
| contstructor: ISnackBarConfig |
| }; |
| jquery__WEBPACK_IMPORTED_MODULE_1___default.a.extend(ISnackBarConfig, _angular_material__WEBPACK_IMPORTED_MODULE_0__["MatSnackBarConfig"]); |
| function ICoasterConfig() { |
| this.icon = ''; |
| this.color = ''; |
| } |
| ICoasterConfig.prototype = { |
| contstructor: ICoasterConfig |
| }; |
| jquery__WEBPACK_IMPORTED_MODULE_1___default.a.extend(ICoasterConfig, ISnackBarConfig); |
| /** |
| * FdsSnackBarService constructor. |
| * |
| * @param MatSnackBar The angular material MatSnackBar. |
| * @constructor |
| */ |
| |
| function FdsSnackBarService(MatSnackBar) { |
| this.snackBarService = MatSnackBar; |
| } |
| FdsSnackBarService.prototype = { |
| contstructor: FdsSnackBarService, |
| |
| /** |
| * Wrapper function over the open() method in MatSnackBar. |
| * |
| * @param message The message to show in the snackbar. |
| * @param action The label for the snackbar action. |
| * @param config Additional configuration options for the snackbar. |
| * |
| * @returns {MatSnackBarRef} The reference to the snackbar. |
| */ |
| open: function open(message, action, config) { |
| return this.snackBarService.open(message, action, config); |
| }, |
| |
| /** |
| * Wrapper function over the openFromComponent() method in MatSnackBar. |
| * Opens a snackbar containing the given component. |
| * |
| * @param component The angular ComponentType<T>. |
| * @param config The angular material MatSnackBarConfig. |
| * |
| * @returns {MatSnackBarRef} The reference to the snackbar. |
| */ |
| openFromComponent: function openFromComponent(component, config) { |
| return this.snackBarService.openFromComponent(component, config); |
| }, |
| |
| /** |
| * Wrapper function over the dismiss() method in MatSnackBar. |
| * Dismisses the currently-open snackbar. |
| */ |
| dismiss: function dismiss() { |
| this.snackBarService.dismiss(); |
| }, |
| |
| /** |
| * Opens a coaster snackbar with the provided config. |
| * |
| * @param config ICoasterConfig { |
| * message?: string; |
| * title?: string; |
| * snackBarRef?: MatSnackBarRef; |
| * viewContainerRef?: ViewContainerRef; |
| * icon?: string; |
| * color?: string; |
| * } |
| * |
| * @returns {MatSnackBarRef} The reference to the snackbar. |
| */ |
| openCoaster: function openCoaster(config) { |
| var snackBarConfig = new ICoasterConfig(); |
| snackBarConfig.verticalPosition = config.verticalPosition; |
| snackBarConfig.horizontalPosition = config.horizontalPosition; |
| snackBarConfig.duration = config.duration; |
| var snackBarRef = this.snackBarService.openFromComponent(_coaster_coaster_component__WEBPACK_IMPORTED_MODULE_2__["FdsCoasterComponent"], snackBarConfig); |
| var coasterComponent = snackBarRef.instance; |
| coasterComponent.snackBarRef = snackBarRef; |
| |
| if (config.title) { |
| coasterComponent.title = config.title; |
| } |
| |
| if (config.message) { |
| coasterComponent.message = config.message; |
| } |
| |
| if (config.icon) { |
| coasterComponent.icon = config.icon; |
| } |
| |
| if (config.color) { |
| coasterComponent.color = config.color; |
| } |
| |
| return snackBarRef; |
| } |
| }; |
| FdsSnackBarService.parameters = [_angular_material__WEBPACK_IMPORTED_MODULE_0__["MatSnackBar"]]; |
| |
| /***/ }), |
| |
| /***/ "./webapp/components/flow-design-system/dialogs/demo/fds-demo-dialog.html": |
| /*!********************************************************************************!*\ |
| !*** ./webapp/components/flow-design-system/dialogs/demo/fds-demo-dialog.html ***! |
| \********************************************************************************/ |
| /*! no static exports found */ |
| /***/ (function(module, exports) { |
| |
| module.exports = "<!--\nLicensed to the Apache Software Foundation (ASF) under one or more\ncontributor license agreements. See the NOTICE file distributed with\nthis work for additional information regarding copyright ownership.\nThe ASF licenses this file to You under the Apache License, Version 2.0\n(the \"License\"); you may not use this file except in compliance with\nthe License. You may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n-->\n\n<div>Hello Dialog!</div>\n"; |
| |
| /***/ }), |
| |
| /***/ "./webapp/components/flow-design-system/dialogs/demo/fds-demo-dialog.js": |
| /*!******************************************************************************!*\ |
| !*** ./webapp/components/flow-design-system/dialogs/demo/fds-demo-dialog.js ***! |
| \******************************************************************************/ |
| /*! exports provided: default */ |
| /***/ (function(module, __webpack_exports__, __webpack_require__) { |
| |
| "use strict"; |
| __webpack_require__.r(__webpack_exports__); |
| /* harmony import */ var _angular_material__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/material */ "./node_modules/@angular/material/esm5/material.es5.js"); |
| /* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js"); |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| |
| /** |
| * NfRegistryEditBucketPolicy constructor. |
| * |
| * @param nfRegistryApi The api service. |
| * @param nfRegistryService The nf-registry.service module. |
| * @param activatedRoute The angular route module. |
| * @param matDialogRef The angular material dialog ref. |
| * @param data The data passed into this component. |
| * @constructor |
| */ |
| |
| function FdsDemoDialog(matDialogRef, data) { |
| // Services |
| this.dialogRef = matDialogRef; |
| this.data = data; |
| } |
| |
| FdsDemoDialog.prototype = { |
| constructor: FdsDemoDialog, |
| |
| /** |
| * Cancel creation of a new policy and close dialog. |
| */ |
| cancel: function cancel() { |
| this.dialogRef.close(); |
| } |
| }; |
| FdsDemoDialog.annotations = [new _angular_core__WEBPACK_IMPORTED_MODULE_1__["Component"]({ |
| template: __webpack_require__(/*! ./fds-demo-dialog.html */ "./webapp/components/flow-design-system/dialogs/demo/fds-demo-dialog.html")})]; |
| FdsDemoDialog.parameters = [_angular_material__WEBPACK_IMPORTED_MODULE_0__["MatDialogRef"], _angular_material__WEBPACK_IMPORTED_MODULE_0__["MAT_DIALOG_DATA"]]; |
| /* harmony default export */ __webpack_exports__["default"] = (FdsDemoDialog); |
| |
| /***/ }), |
| |
| /***/ "./webapp/components/flow-design-system/fds-demo.html": |
| /*!************************************************************!*\ |
| !*** ./webapp/components/flow-design-system/fds-demo.html ***! |
| \************************************************************/ |
| /*! no static exports found */ |
| /***/ (function(module, exports) { |
| |
| module.exports = "<!--\nLicensed to the Apache Software Foundation (ASF) under one or more\ncontributor license agreements. See the NOTICE file distributed with\nthis work for additional information regarding copyright ownership.\nThe ASF licenses this file to You under the Apache License, Version 2.0\n(the \"License\"); you may not use this file except in compliance with\nthe License. You may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n-->\n\n<mat-sidenav-container>\n <mat-sidenav #sidenav mode=\"over\" position=\"end\" opened=\"false\">\n <div fxLayout=\"column\" fxLayoutAlign=\"space-between center\">\n <p>You can also open a dialog from a side nav.</p>\n <button mat-raised-button color=\"fds-primary\" (click)=\"openDialog()\">Show simple dialog</button>\n </div>\n </mat-sidenav>\n <div id=\"fds-demo\">\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\">Apache NiFi Flow Design System</mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content class=\"pad-top-sm\">\n <p>With the Apache NiFi Flow Design System module, we get an atomic, reusable component platform for\n Apache NiFi and its sub-projects to consume, while collaborating in an open source model. This\n module packages the <a class=\"link\" href=\"https://material.angular.io/components\" target=\"_blank\">Angular\n Material</a> module as well as the <a class=\"link\"\n href=\"https://teradata.github.io/covalent/#/components\"\n target=\"_blank\">Teradata Covalent</a> module. These\n modules have been themed to match the FDS color palette.</p>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"Typography\">Typography <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"Typography\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <p class=\"mat-body-1\">FDS provides typography CSS classes you can use to create visual consistency across your application. Optionally style tags with the classes shown below:</p>\n <div layout-align=\"center end\">\n <div layout=\"row\" layout-align=\"start center\">\n <code flex=\"15\">.mat-display-4</code>\n <span class=\"mat-display-4\">Display 4</span>\n </div>\n <div layout=\"row\" layout-align=\"start center\">\n <code flex=\"15\">.mat-display-3</code>\n <span class=\"mat-display-3\">Display 3</span>\n </div>\n <div layout=\"row\" layout-align=\"start center\">\n <code flex=\"15\">.mat-display-2</code>\n <span class=\"mat-display-2\">Display 2</span>\n </div>\n <div layout=\"row\" layout-align=\"start center\">\n <code flex=\"15\">.mat-display-1</code>\n <span class=\"mat-display-1\">Display 1</span>\n </div>\n <div layout=\"row\" layout-align=\"start center\">\n <code flex=\"15\">.mat-headline</code>\n <span class=\"mat-headline\">Headline</span>\n </div>\n <div layout=\"row\" layout-align=\"start center\">\n <code flex=\"15\">.md-title</code>\n <span class=\"md-title\">Title</span>\n </div>\n <div layout=\"row\" layout-align=\"start center\">\n <code flex=\"15\">.md-subhead</code>\n <span class=\"md-subhead\">Subhead</span>\n </div>\n <div layout=\"row\" layout-align=\"start center\">\n <code flex=\"15\">.link</code>\n <span class=\"link\">Link</span>\n </div>\n <div layout=\"row\" layout-align=\"start center\">\n <code flex=\"15\">.mat-body-1</code>\n <span class=\"mat-body-1\">Body 1</span>\n </div>\n <div layout=\"row\" layout-align=\"start center\">\n <code flex=\"15\">.mat-body-2</code>\n <span class=\"mat-body-2\">Body 2</span>\n </div>\n <div layout=\"row\" layout-align=\"start center\">\n <code flex=\"15\">.mat-caption</code>\n <span class=\"mat-caption\">Caption</span>\n </div>\n </div>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <span class=\"mat-display-4\">Display 4</span>\n <span class=\"mat-display-3\">Display 3</span>\n <span class=\"mat-display-2\">Display 2</span>\n <span class=\"mat-display-1\">Display 1</span>\n <span class=\"mat-headline\">Headline</span>\n <span class=\"md-title\">Title</span>\n <span class=\"md-subhead\">Subhead</span>\n <span class=\"link\">Link</span>\n <span class=\"mat-body-1\">Body 1</span>\n <span class=\"mat-body-2\">Body 2</span>\n <span class=\"mat-caption\">Caption</span>\n ]]>\n </pre>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"RaisedButtons\">Raised Buttons <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"RaisedButtons\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <p>Tip: Use UPPERCASE text for 1-2 words, and Titlecase text for 3+ words.</p>\n <button mat-raised-button color=\"primary\">Primary</button>\n <button mat-raised-button color=\"accent\">Accent</button>\n <button mat-raised-button color=\"warn\">Warn</button>\n <button mat-raised-button color=\"fds-primary\">FDS Primary</button>\n <button mat-raised-button color=\"fds-secondary\">FDS Secondary</button>\n <button mat-raised-button color=\"fds-regular\">FDS regular</button>\n <button mat-raised-button color=\"fds-warn\">FDS warn</button>\n <button mat-raised-button color=\"fds-critical\">FDS critical</button>\n <button mat-raised-button disabled color=\"primary\">Primary</button>\n <button mat-raised-button disabled color=\"accent\">Accent</button>\n <button mat-raised-button disabled color=\"warn\">Warn</button>\n <button mat-raised-button disabled color=\"fds-primary\">FDS primary</button>\n <button mat-raised-button disabled color=\"fds-secondary\">FDS Secondary</button>\n <button mat-raised-button disabled color=\"fds-regular\">FDS regular</button>\n <button mat-raised-button disabled color=\"fds-warn\">FDS warn</button>\n <button mat-raised-button disabled color=\"fds-critical\">FDS critical</button>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <!-- Themed Raised Buttons -->\n <button mat-raised-button color=\"primary\">Primary</button>\n <button mat-raised-button color=\"accent\">Secondary</button>\n <button mat-raised-button color=\"warn\">warn</button>\n <button mat-raised-button color=\"fds-primary\">FDS Primary</button>\n <button mat-raised-button color=\"fds-secondary\">FDS Secondary</button>\n <button mat-raised-button color=\"fds-regular\">FDS regular</button>\n <button mat-raised-button color=\"fds-warn\">FDS warn</button>\n <button mat-raised-button color=\"fds-critical\">FDS critical</button>\n <!-- Disabled Raised Buttons -->\n <button mat-raised-button disabled color=\"primary\">Primary</button>\n <button mat-raised-button disabled color=\"accent\">Secondary</button>\n <button mat-raised-button disabled color=\"warn\">warn</button>\n <button mat-raised-button disabled color=\"fds-primary\">FDS primary</button>\n <button mat-raised-button disabled color=\"fds-secondary\">FDS Secondary</button>\n <button mat-raised-button disabled color=\"fds-regular\">FDS regular</button>\n <button mat-raised-button disabled color=\"fds-warn\">FDS warn</button>\n <button mat-raised-button disabled color=\"fds-critical\">FDS critical</button>\n ]]>\n </pre>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"FlatButtons\">Flat Buttons <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"FlatButtons\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <mat-card-actions>\n <button mat-button>Default</button>\n <button mat-button color=\"primary\">Primary</button>\n <button mat-button color=\"accent\">Secondary</button>\n <button mat-button color=\"warn\">Warn</button>\n <button mat-button disabled>Disabled Default</button>\n <button mat-button disabled color=\"primary\">Disabled Primary</button>\n <button mat-button disabled color=\"accent\">Disabled Secondary</button>\n <button mat-button disabled color=\"warn\">Disabled Warn</button>\n </mat-card-actions>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <!-- Themed Flat Buttons -->\n <button mat-button>Default</button>\n <button mat-button color=\"primary\">Primary</button>\n <button mat-button color=\"accent\">Secondary</button>\n <button mat-button color=\"warn\">warn</button>\n <!-- Disabled Flat Buttons -->\n <button mat-button disabled>disabled Default</button>\n <button mat-button disabled color=\"primary\">disabled primary</button>\n <button mat-button disabled color=\"accent\">disabled Secondary</button>\n <button mat-button disabled color=\"warn\">disabled warn</button>\n ]]>\n </pre>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"FabButtons\">Fab Buttons <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"FabButtons\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <mat-card-actions class=\"pad-left-sm\">\n <button mat-mini-fab color=\"primary\">P</button>\n <button mat-mini-fab color=\"accent\">A</button>\n <button mat-mini-fab color=\"warn\">W</button>\n <button mat-mini-fab disabled color=\"primary\">P</button>\n <button mat-mini-fab disabled color=\"accent\">A</button>\n <button mat-mini-fab disabled color=\"warn\">W</button>\n </mat-card-actions>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <!-- Themed Fab Buttons -->\n <button mat-mini-fab color=\"primary\">P</button>\n <button mat-mini-fab color=\"accent\">A</button>\n <button mat-mini-fab color=\"warn\">W</button>\n <!-- Disabled Fab Buttons -->\n <button mat-mini-fab disabled color=\"primary\">P</button>\n <button mat-mini-fab disabled color=\"accent\">A</button>\n <button mat-mini-fab disabled color=\"warn\">W</button>\n ]]>\n </pre>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"ButtonToggles\">Button Toggles <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"ButtonToggles\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <mat-button-toggle-group name=\"alignment\">\n <mat-button-toggle value=\"left\">\n <mat-icon>format_align_left</mat-icon>\n </mat-button-toggle>\n <mat-button-toggle value=\"center\">\n <mat-icon>format_align_center</mat-icon>\n </mat-button-toggle>\n <mat-button-toggle value=\"right\">\n <mat-icon>format_align_right</mat-icon>\n </mat-button-toggle>\n <mat-button-toggle value=\"justify\">\n <mat-icon>format_align_justify</mat-icon>\n </mat-button-toggle>\n </mat-button-toggle-group>\n <div fxLayout=\"row\" class=\"pad-top-md pad-bot-md\"></div>\n <mat-button-toggle-group name=\"onOffToggle\" class=\"on-off-toggle-group\">\n <mat-button-toggle value=\"on\" [checked]=\"true\">\n ON\n </mat-button-toggle>\n <mat-button-toggle value=\"off\" class=\"off-toggle\">\n OFF\n </mat-button-toggle>\n </mat-button-toggle-group>\n <div fxLayout=\"row\" class=\"pad-top-md pad-bot-md\"></div>\n <mat-button-toggle-group fxLayout=\"row\" fxLayoutAlign=\"space-between center\"\n class=\"expansion-panel-filter-toggle-group\" multiple>\n <mat-button-toggle>\n <div fxFlex fxLayout=\"column\" fxLayoutAlign=\"space-around stretch\">\n <div class=\"mat-display-1 pad-top-sm\" fxFlex=\"55\">34</div>\n <div class=\"pad-top-sm\" fxFlex=\"45\">Assets</div>\n </div>\n </mat-button-toggle>\n <mat-button-toggle>\n <div fxFlex fxLayout=\"column\" fxLayoutAlign=\"space-around stretch\">\n <div class=\"mat-display-1 pad-top-sm\" fxFlex=\"55\">300</div>\n <div class=\"pad-top-sm\" fxFlex=\"45\">Extensions</div>\n </div>\n </mat-button-toggle>\n <mat-button-toggle>\n <div fxFlex fxLayout=\"column\" fxLayoutAlign=\"space-around stretch\">\n <div class=\"mat-display-1 pad-top-sm\" fxFlex=\"55\">5000</div>\n <div class=\"pad-top-sm\" fxFlex=\"45\">Flows</div>\n </div>\n </mat-button-toggle>\n <mat-button-toggle>\n <div fxFlex fxLayout=\"column\" fxLayoutAlign=\"space-around stretch\">\n <div class=\"mat-display-1 pad-top-sm\" fxFlex=\"55\">0</div>\n <div class=\"pad-top-sm\" fxFlex=\"45\">Certifications</div>\n </div>\n </mat-button-toggle>\n </mat-button-toggle-group>\n <div fxLayout=\"row\" class=\"pad-top-md pad-bot-md\"></div>\n <mat-button-toggle-group name=\"fds-administration-perspective\" fxLayout=\"row\" class=\"tab-toggle-group\">\n <mat-button-toggle value=\"general\">\n general\n </mat-button-toggle>\n <div fxLayout=\"row\" class=\"pad-left-md\"></div>\n <mat-button-toggle value=\"users\">\n Users\n </mat-button-toggle>\n <div fxLayout=\"row\" class=\"pad-left-md\"></div>\n <mat-button-toggle value=\"workflow\">\n Workflow\n </mat-button-toggle>\n </mat-button-toggle-group>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <mat-button-toggle-group name=\"alignment\">\n <mat-button-toggle value=\"left\">\n <mat-icon>format_align_left</mat-icon>\n </mat-button-toggle>\n <mat-button-toggle value=\"center\">\n <mat-icon>format_align_center</mat-icon>\n </mat-button-toggle>\n <mat-button-toggle value=\"right\">\n <mat-icon>format_align_right</mat-icon>\n </mat-button-toggle>\n <mat-button-toggle value=\"justify\">\n <mat-icon>format_align_justify</mat-icon>\n </mat-button-toggle>\n </mat-button-toggle-group>\n <div fxLayout=\"row\" class=\"pad-top-md pad-bot-md\"></div>\n <mat-button-toggle-group name=\"onOffToggle\" class=\"on-off-toggle-group\">\n <mat-button-toggle value=\"on\" [checked]=\"true\">\n ON\n </mat-button-toggle>\n <mat-button-toggle value=\"off\" class=\"off-toggle\">\n OFF\n </mat-button-toggle>\n </mat-button-toggle-group>\n <div fxLayout=\"row\" class=\"pad-top-md pad-bot-md\"></div>\n <mat-button-toggle-group fxLayout=\"row\" fxLayoutAlign=\"space-between center\"\n class=\"expansion-panel-filter-toggle-group\" multiple>\n <mat-button-toggle>\n <div fxFlex fxLayout=\"column\" fxLayoutAlign=\"space-around stretch\">\n <div class=\"mat-display-1 pad-top-sm\" fxFlex=\"55\">34</div>\n <div class=\"pad-top-sm\" fxFlex=\"45\">Assets</div>\n </div>\n </mat-button-toggle>\n <mat-button-toggle>\n <div fxFlex fxLayout=\"column\" fxLayoutAlign=\"space-around stretch\">\n <div class=\"mat-display-1 pad-top-sm\" fxFlex=\"55\">300</div>\n <div class=\"pad-top-sm\" fxFlex=\"45\">Extensions</div>\n </div>\n </mat-button-toggle>\n <mat-button-toggle>\n <div fxFlex fxLayout=\"column\" fxLayoutAlign=\"space-around stretch\">\n <div class=\"mat-display-1 pad-top-sm\" fxFlex=\"55\">5000</div>\n <div class=\"pad-top-sm\" fxFlex=\"45\">Flows</div>\n </div>\n </mat-button-toggle>\n <mat-button-toggle>\n <div fxFlex fxLayout=\"column\" fxLayoutAlign=\"space-around stretch\">\n <div class=\"mat-display-1 pad-top-sm\" fxFlex=\"55\">0</div>\n <div class=\"pad-top-sm\" fxFlex=\"45\">Certifications</div>\n </div>\n </mat-button-toggle>\n </mat-button-toggle-group>\n <div fxLayout=\"row\" class=\"pad-top-md pad-bot-md\"></div>\n <mat-button-toggle-group name=\"fds-administration-perspective\" fxLayout=\"row\" class=\"tab-toggle-group\">\n <mat-button-toggle value=\"general\">\n general\n </mat-button-toggle>\n <div fxLayout=\"row\" class=\"pad-left-md\"></div>\n <mat-button-toggle value=\"users\">\n Users\n </mat-button-toggle>\n <div fxLayout=\"row\" class=\"pad-left-md\"></div>\n <mat-button-toggle value=\"workflow\">\n Workflow\n </mat-button-toggle>\n </mat-button-toggle-group>\n ]]>\n </pre>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"Input\">Input <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"Input\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <form>\n <div layout=\"row\" layout-margin>\n <mat-form-field floatLabel=\"always\" floatPlaceholder=\"always\" flex>\n <input matInput placeholder=\"Company (disabled)\" disabled value=\"Google\">\n </mat-form-field>\n </div>\n <div layout=\"row\" layout-margin>\n <mat-form-field floatLabel=\"always\" floatPlaceholder=\"always\" flex>\n <input matInput disabled placeholder=\"First name\">\n </mat-form-field>\n <mat-form-field floatLabel=\"always\" flex>\n <input matInput placeholder=\"Long Last Name That Will Be Truncated\">\n </mat-form-field>\n </div>\n <div layout=\"row\" layout-margin>\n <div flex fxLayoutAlign=\"start center\">\n <mat-form-field floatLabel=\"always\" flex>\n <input matInput placeholder=\"Button Addon with dropdown\">\n </mat-form-field>\n <button class=\"input-button\" color=\"fds-regular\" mat-raised-button\n [matMenuTriggerFor]=\"inputButtonDropdownAddonMenu\">\n Select<i class=\"fa fa-caret-down\" aria-hidden=\"true\"></i>\n </button>\n <mat-menu xPosition=\"before\" #inputButtonDropdownAddonMenu=\"matMenu\"\n [overlapTrigger]=\"false\">\n <button mat-menu-item> Refresh</button>\n <button mat-menu-item> Settings</button>\n <button mat-menu-item> Help</button>\n <button mat-menu-item disabled> Sign Out</button>\n </mat-menu>\n </div>\n <div flex fxLayoutAlign=\"start center\">\n <mat-form-field floatLabel=\"always\" floatPlaceholder=\"always\" flex>\n <input matInput placeholder=\"Button Addon\">\n </mat-form-field>\n <button class=\"input-button\" color=\"fds-regular\" mat-raised-button>\n Search\n </button>\n </div>\n </div>\n <div layout=\"row\" layout-margin>\n <div flex fxLayoutAlign=\"start center\">\n <mat-form-field floatLabel=\"always\" floatPlaceholder=\"always\" flex>\n <input disabled matInput placeholder=\"Button Addon with dropdown\">\n </mat-form-field>\n <button disabled class=\"input-button\" color=\"fds-regular\" mat-raised-button>\n Select<i class=\"fa fa-caret-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div flex fxLayoutAlign=\"start center\">\n <mat-form-field floatLabel=\"always\" floatPlaceholder=\"always\" flex>\n <input disabled matInput placeholder=\"Button Addon\">\n </mat-form-field>\n <button disabled class=\"input-button\" color=\"fds-regular\" mat-raised-button>\n Search\n </button>\n </div>\n </div>\n <div layout=\"row\" layout-margin>\n <mat-form-field floatLabel=\"always\" flex>\n <textarea matInput placeholder=\"Address\" value=\"1600 Amphitheatre Pkway\"></textarea>\n </mat-form-field>\n </div>\n <div layout=\"row\" layout-margin>\n <mat-form-field floatLabel=\"always\" floatPlaceholder=\"always\" flex>\n <textarea disabled value=\"Address 2 Value\" matInput placeholder=\"Address 2\"></textarea>\n </mat-form-field>\n </div>\n <div layout=\"row\" layout-margin>\n <mat-form-field floatLabel=\"always\" floatPlaceholder=\"always\" flex>\n <input matInput placeholder=\"City\">\n </mat-form-field>\n <mat-form-field floatLabel=\"always\" floatPlaceholder=\"always\" flex>\n <input matInput placeholder=\"State\">\n </mat-form-field>\n <mat-form-field floatLabel=\"always\" floatPlaceholder=\"always\" flex>\n <input matInput #postalCode maxlength=\"5\" placeholder=\"Postal Code\" value=\"94043\">\n <mat-hint align=\"end\">{{postalCode.value.length}} / 5</mat-hint>\n </mat-form-field>\n </div>\n </form>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <!-- Inputs -->\n <form>\n <div layout=\"row\" layout-margin>\n <mat-form-field floatLabel=\"always\" floatPlaceholder=\"always\" flex>\n <input matInput placeholder=\"Company (disabled)\" disabled value=\"Google\">\n </mat-form-field>\n </div>\n <div layout=\"row\" layout-margin>\n <mat-form-field floatLabel=\"always\" floatPlaceholder=\"always\" flex>\n <input matInput disabled placeholder=\"First name\">\n </mat-form-field>\n <mat-form-field floatLabel=\"always\" flex>\n <input matInput placeholder=\"Long Last Name That Will Be Truncated\">\n </mat-form-field>\n </div>\n <div layout=\"row\" layout-margin>\n <div flex fxLayoutAlign=\"start center\">\n <mat-form-field floatLabel=\"always\" flex>\n <input matInput placeholder=\"Button Addon with dropdown\">\n </mat-form-field>\n <button class=\"input-button\" color=\"fds-regular\" mat-raised-button\n [matMenuTriggerFor]=\"inputButtonDropdownAddonMenu\">\n Select<i class=\"fa fa-caret-down\" aria-hidden=\"true\"></i>\n </button>\n <mat-menu xPosition=\"before\" #inputButtonDropdownAddonMenu=\"matMenu\" [overlapTrigger]=\"false\">\n <button mat-menu-item> Refresh </button>\n <button mat-menu-item> Settings </button>\n <button mat-menu-item> Help </button>\n <button mat-menu-item disabled> Sign Out </button>\n </mat-menu>\n </div>\n <div flex fxLayoutAlign=\"start center\">\n <mat-form-field floatLabel=\"always\" floatPlaceholder=\"always\" flex>\n <input matInput placeholder=\"Button Addon\">\n </mat-form-field>\n <button class=\"input-button\" color=\"fds-regular\" mat-raised-button>\n Search\n </button>\n </div>\n </div>\n <div layout=\"row\" layout-margin>\n <div flex fxLayoutAlign=\"start center\">\n <mat-form-field floatLabel=\"always\" floatPlaceholder=\"always\" flex>\n <input disabled matInput placeholder=\"Button Addon with dropdown\">\n </mat-form-field>\n <button disabled class=\"input-button\" color=\"fds-regular\" mat-raised-button>\n Select<i class=\"fa fa-caret-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div flex fxLayoutAlign=\"start center\">\n <mat-form-field floatLabel=\"always\" floatPlaceholder=\"always\" flex>\n <input disabled matInput placeholder=\"Button Addon\">\n </mat-form-field>\n <button disabled class=\"input-button\" color=\"fds-regular\" mat-raised-button>\n Search\n </button>\n </div>\n </div>\n <div layout=\"row\" layout-margin>\n <mat-form-field floatLabel=\"always\" flex>\n <textarea matInput placeholder=\"Address\" value=\"1600 Amphitheatre Pkway\"></textarea>\n </mat-form-field>\n </div>\n <div layout=\"row\" layout-margin>\n <mat-form-field floatLabel=\"always\" floatPlaceholder=\"always\" flex>\n <textarea disabled value=\"Address 2 Value\" matInput placeholder=\"Address 2\"></textarea>\n </mat-form-field>\n </div>\n <div layout=\"row\" layout-margin>\n <mat-form-field floatLabel=\"always\" floatPlaceholder=\"always\" flex>\n <input matInput placeholder=\"City\">\n </mat-form-field>\n <mat-form-field floatLabel=\"always\" floatPlaceholder=\"always\" flex>\n <input matInput placeholder=\"State\">\n </mat-form-field>\n <mat-form-field floatLabel=\"always\" floatPlaceholder=\"always\" flex>\n <input matInput #postalCode maxlength=\"5\" placeholder=\"Postal Code\" value=\"94043\">\n <mat-hint align=\"end\">{{postalCode.value.length}} / 5</mat-hint>\n </mat-form-field>\n </div>\n </form>\n ]]>\n </pre>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"Tabs\">Tabs <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"Tabs\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <mat-tab-group dynamicHeight color=\"accent\">\n <mat-tab>\n <ng-template mat-tab-label>One</ng-template>\n <h3 class=\"md-title\">First tab content</h3>\n <p>Plaid echo park knausgaard normcore franzen cronut. Pickled humblebrag tofu hoodie, umami\n salvia farm-to-table schlitz try-hard food truck knausgaard pabst. Yuccie portland jean\n shorts, authentic mixtape waistcoat gentrify blue bottle. Fixie kickstarter church-key small\n batch seitan, shabby chic vegan listicle before they sold out. Hammock raw denim flannel\n tousled seitan you probably haven't heard of them. Trust fund man bun pug, kickstarter\n artisan selvage letterpress cornhole tote bag butcher locavore. Affogato try-hard\n kickstarter seitan, DIY pickled hella godard pork belly four loko ugh.</p>\n </mat-tab>\n <mat-tab>\n <ng-template mat-tab-label>Two</ng-template>\n <h3 class=\"md-title\">Second tab content</h3>\n <p>Hashtag distillery skateboard man bun gochujang, salvia man braid art party meggings heirloom\n kitsch farm-to-table. Franzen beard fingerstache gentrify, heirloom portland ennui XOXO\n microdosing kitsch plaid. Chicharrones bushwick chia, banh mi irony tattooed hammock butcher\n shabby chic taxidermy semiotics marfa post-ironic. Blue bottle keffiyeh farm-to-table ennui,\n chambray pitchfork art party pinterest artisan pop-up. Etsy banjo marfa, blue bottle\n kombucha crucifix XOXO tousled beard. Tilde disrupt kale chips bicycle rights skateboard\n master cleanse hella shoreditch, meditation retro shabby chic vice heirloom. Etsy listicle\n vice actually, iPhone chia hoodie four loko.</p>\n </mat-tab>\n </mat-tab-group>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <mat-tab-group dynamicHeight color=\"accent\">\n <mat-tab>\n <ng-template mat-tab-label>First tab content</ng-template>\n <h1>First content</h1>\n <p>...</p>\n </mat-tab>\n <mat-tab>\n <ng-template mat-tab-label>Second tab content</ng-template>\n <h1>Second tab content</h1>\n <p>...</p>\n </mat-tab>\n </mat-tab-group>\n ]]>\n </pre>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"Stepper\">Stepper <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"Stepper\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <td-steps mode=\"vertical\">\n <td-step label=\"Version 1\"\n sublabel=\"by Admin\"\n [active]=\"true\">\n <div fxLayout=\"column\" fxLayoutAlign=\"space-between stretch\">\n <div fxLayout=\"row\" class=\"md-body-2\">\n Comments go here\n </div>\n <div fxLayout=\"row\" class=\"mat-caption\">\n An hour ago\n </div>\n </div>\n </td-step>\n <td-step label=\"Version 2\"\n sublabel=\"by Admin\">\n <div fxLayout=\"column\" fxLayoutAlign=\"space-between stretch\">\n <div fxLayout=\"row\" class=\"md-body-2\">\n Comments go here\n </div>\n <div fxLayout=\"row\" class=\"mat-caption\">\n A day ago\n </div>\n </div>\n </td-step>\n </td-steps>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <td-steps mode=\"vertical\">\n <td-step label=\"Version 1\"\n sublabel=\"by Admin\"\n [active]=\"true\">\n <div fxLayout=\"column\" fxLayoutAlign=\"space-between stretch\">\n <div fxLayout=\"row\" class=\"md-body-2\">\n Description goes here\n </div>\n <div fxLayout=\"row\" class=\"mat-caption\">\n An hour ago\n </div>\n </div>\n </td-step>\n <td-step label=\"Version 2\"\n sublabel=\"by Admin\">\n <div fxLayout=\"column\" fxLayoutAlign=\"space-between stretch\">\n <div fxLayout=\"row\" class=\"md-body-2\">\n Description goes here\n </div>\n <div fxLayout=\"row\" class=\"mat-caption\">\n A day ago\n </div>\n </div>\n </td-step>\n </td-steps>\n ]]>\n </pre>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"Autocomplete\">Autocomplete <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"Autocomplete\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <div class=\"pad-top-sm\" layout=\"row\">\n <mat-form-field floatLabel=\"always\" flex=\"50\">\n <input matInput placeholder=\"State\" [matAutocomplete]=\"tdAuto\" [(ngModel)]=\"currentState\"\n #modelDir=\"ngModel\" (ngModelChange)=\"this.tdStates = filterStates(currentState)\"\n [disabled]=\"tdDisabled\">\n </mat-form-field>\n </div>\n <div class=\"push-top\">\n <button mat-button (click)=\"modelDir.reset()\" class=\"text-upper\">Reset</button>\n <button mat-button (click)=\"currentState='California'\" class=\"text-upper\">Set value</button>\n <button mat-button (click)=\"tdDisabled=!tdDisabled\" class=\"text-upper\">Toggle disabled</button>\n </div>\n <mat-autocomplete #tdAuto=\"matAutocomplete\">\n <mat-option *ngFor=\"let state of tdStates\" [value]=\"state.name\">\n <span>{{ state.name }}</span>\n <span class=\"demo-secondary-text\"> ({{state.code}}) </span>\n </mat-option>\n </mat-autocomplete>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <div class=\"pad-top-sm\" layout=\"row\">\n <mat-form-field floatLabel=\"always\" flex=\"50\">\n <input matInput placeholder=\"State\" [matAutocomplete]=\"tdAuto\" [(ngModel)]=\"currentState\"\n #modelDir=\"ngModel\" (ngModelChange)=\"this.tdStates = filterStates(currentState)\"\n [disabled]=\"tdDisabled\">\n </mat-form-field>\n </div>\n <div class=\"push-top\">\n <button mat-button (click)=\"modelDir.reset()\" class=\"text-upper\">Reset</button>\n <button mat-button (click)=\"currentState='California'\" class=\"text-upper\">Set value</button>\n <button mat-button (click)=\"tdDisabled=!tdDisabled\" class=\"text-upper\">Toggle disabled</button>\n </div>\n <mat-autocomplete #tdAuto=\"matAutocomplete\">\n <mat-option *ngFor=\"let state of tdStates\" [value]=\"state.name\">\n <span>{ { state.name } }</span>\n <span class=\"demo-secondary-text\"> ({ {state.code} }) </span>\n </mat-option>\n </mat-autocomplete>\n ]]>\n </pre>\n <p>Javascript:</p>\n <pre lang=\"javascript\">\n <![CDATA[\n this.currentState = '';\n this.reactiveStates = '';\n this.tdStates = [];\n this.tdDisabled = false;\n this.states = [\n { code: 'AL', name: 'Alabama' },\n { code: 'AK', name: 'Alaska' },\n { code: 'AZ', name: 'Arizona' },\n { code: 'AR', name: 'Arkansas' },\n { code: 'CA', name: 'California' },\n { code: 'CO', name: 'Colorado' },\n { code: 'CT', name: 'Connecticut' },\n { code: 'DE', name: 'Delaware' },\n { code: 'FL', name: 'Florida' },\n { code: 'GA', name: 'Georgia' },\n { code: 'HI', name: 'Hawaii' },\n { code: 'ID', name: 'Idaho' },\n { code: 'IL', name: 'Illinois' },\n { code: 'IN', name: 'Indiana' },\n { code: 'IA', name: 'Iowa' },\n { code: 'KS', name: 'Kansas' },\n { code: 'KY', name: 'Kentucky' },\n { code: 'LA', name: 'Louisiana' },\n { code: 'ME', name: 'Maine' },\n { code: 'MD', name: 'Maryland' },\n { code: 'MA', name: 'Massachusetts' },\n { code: 'MI', name: 'Michigan' },\n { code: 'MN', name: 'Minnesota' },\n { code: 'MS', name: 'Mississippi' },\n { code: 'MO', name: 'Missouri' },\n { code: 'MT', name: 'Montana' },\n { code: 'NE', name: 'Nebraska' },\n { code: 'NV', name: 'Nevada' },\n { code: 'NH', name: 'New Hampshire' },\n { code: 'NJ', name: 'New Jersey' },\n { code: 'NM', name: 'New Mexico' },\n { code: 'NY', name: 'New York' },\n { code: 'NC', name: 'North Carolina' },\n { code: 'ND', name: 'North Dakota' },\n { code: 'OH', name: 'Ohio' },\n { code: 'OK', name: 'Oklahoma' },\n { code: 'OR', name: 'Oregon' },\n { code: 'PA', name: 'Pennsylvania' },\n { code: 'RI', name: 'Rhode Island' },\n { code: 'SC', name: 'South Carolina' },\n { code: 'SD', name: 'South Dakota' },\n { code: 'TN', name: 'Tennessee' },\n { code: 'TX', name: 'Texas' },\n { code: 'UT', name: 'Utah' },\n { code: 'VT', name: 'Vermont' },\n { code: 'VA', name: 'Virginia' },\n { code: 'WA', name: 'Washington' },\n { code: 'WV', name: 'West Virginia' },\n { code: 'WI', name: 'Wisconsin' },\n { code: 'WY', name: 'Wyoming' },\n ];\n\n ...\n\n displayFn: function(value) {\n return value && typeof value === 'object' ? value.name : value;\n },\n\n filterStates: function(val) {\n return val ? this.states.filter((s) => s.name.match(new RegExp(val, 'gi'))) : this.states;\n },\n\n ...\n ]]>\n </pre>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"Filter\">Filter <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"Filter\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <h3 class=\"md-title\">Autocomplete with chips and no custom inputs</h3>\n <mat-divider></mat-divider>\n <mat-tab-group mat-stretch-tabs dynamicHeight color=\"accent\">\n <mat-tab>\n <ng-template mat-tab-label>Demo</ng-template>\n <div class=\"push\">\n <div class=\"mat-body-1\">Type and select a preset option:</div>\n <td-chips [items]=\"items\" [(ngModel)]=\"itemsRequireMatch\"\n placeholder=\"Enter autocomplete strings\" [disabled]=\"readOnly\"\n requireMatch></td-chips>\n </div>\n </mat-tab>\n <mat-tab>\n <ng-template mat-tab-label>Code</ng-template>\n <mat-card-content>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <td-chips [items]=\"items\" [(ngModel)]=\"itemsRequireMatch\" placeholder=\"Enter autocomplete strings\"\n [disabled]=\"readOnly\" requireMatch></td-chips>\n ]]>\n </pre>\n <p>Javascript:</p>\n <pre lang=\"javascript\">\n <![CDATA[\n this.readOnly = false;\n\n this.items = [\n 'stepper',\n 'expansion-panel',\n 'markdown',\n 'highlight',\n 'loading',\n 'media',\n 'chips',\n 'http',\n 'json-formatter',\n 'pipes',\n 'need more?',\n ];\n\n this.itemsRequireMatch = this.items.slice(0, 6);\n\n ...\n\n toggleReadOnly: function() {\n this.readOnly = !this.readOnly;\n },\n\n ...\n ]]>\n </pre>\n </mat-card-content>\n </mat-tab>\n </mat-tab-group>\n <mat-divider></mat-divider>\n <mat-card-actions>\n <button mat-button color=\"primary\" (click)=\"toggleReadOnly()\" class=\"text-upper\">Toggle ReadOnly\n </button>\n </mat-card-actions>\n </mat-card-content>\n <mat-card-content>\n <h3 class=\"md-title\">Autocomplete with custom inputs</h3>\n <mat-divider></mat-divider>\n <mat-tab-group mat-stretch-tabs dynamicHeight color=\"accent\">\n <mat-tab>\n <ng-template mat-tab-label>Demo</ng-template>\n <div class=\"push\">\n <div class=\"mat-body-1\">Type and select option or enter custom text and press enter:</div>\n <td-chips [items]=\"items\" placeholder=\"Enter any string\"></td-chips>\n </div>\n </mat-tab>\n <mat-tab>\n <ng-template mat-tab-label>Code</ng-template>\n <mat-card-content>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <td-chips [items]=\"items\" placeholder=\"Enter any string\"></td-chips>\n ]]>\n </pre>\n <p>Javascript:</p>\n <pre lang=\"javascript\">\n <![CDATA[\n this.items = [\n 'stepper',\n 'expansion-panel',\n 'markdown',\n 'highlight',\n 'loading',\n 'media',\n 'chips',\n 'http',\n 'json-formatter',\n 'pipes',\n 'need more?',\n ];\n ]]>\n </pre>\n </mat-card-content>\n </mat-tab>\n </mat-tab-group>\n </mat-card-content>\n <mat-card-content>\n <h3 class=\"md-title\">Demo allowing custom inputs for tags</h3>\n <mat-divider></mat-divider>\n <mat-tab-group mat-stretch-tabs dynamicHeight color=\"accent\">\n <mat-tab>\n <ng-template mat-tab-label>Demo</ng-template>\n <div class=\"push\">\n <div class=\"mat-body-1\">Type any test and press enter:</div>\n <td-chips placeholder=\"Enter any string\"></td-chips>\n </div>\n </mat-tab>\n <mat-tab>\n <ng-template mat-tab-label>Code</ng-template>\n <mat-card-content>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <td-chips placeholder=\"Enter any string\"></td-chips>\n ]]>\n </pre>\n </mat-card-content>\n </mat-tab>\n </mat-tab-group>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"SearchableExpansionPanels\">Searchable/Filterable Expansion Panels <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"SearchableExpansionPanels\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <mat-tab-group mat-stretch-tabs color=\"accent\">\n <mat-tab>\n <ng-template mat-tab-label>Demo</ng-template>\n <div class=\"pad-top-md pad-bottom-md pad-right-xxl pad-left-xxl\">\n <div class=\"pad-top-md pad-bottom-sm\">\n <mat-button-toggle-group fxLayout=\"row\" fxLayoutAlign=\"space-between center\"\n class=\"expansion-panel-filter-toggle-group\" multiple>\n <mat-button-toggle (change)=\"toggleDropletsFilter('type:asset')\"\n [checked]=\"isDropletFilterChecked('type:asset')\">\n <div fxFlex fxLayout=\"column\" fxLayoutAlign=\"space-around stretch\">\n <div class=\"mat-display-1 pad-top-sm\"\n fxFlex=\"55\">{{getDropletTypeCount('asset')}}</div>\n <div class=\"pad-top-sm\" fxFlex=\"45\">Assets</div>\n </div>\n </mat-button-toggle>\n <mat-button-toggle (change)=\"toggleDropletsFilter('type:extension')\"\n [checked]=\"isDropletFilterChecked('type:extension')\">\n <div fxFlex fxLayout=\"column\" fxLayoutAlign=\"space-around stretch\">\n <div class=\"mat-display-1 pad-top-sm\"\n fxFlex=\"55\">{{getDropletTypeCount('extension')}}</div>\n <div class=\"pad-top-sm\" fxFlex=\"45\">Extensions</div>\n </div>\n </mat-button-toggle>\n <mat-button-toggle (change)=\"toggleDropletsFilter('type:flow')\"\n [checked]=\"isDropletFilterChecked('type:flow')\">\n <div fxFlex fxLayout=\"column\" fxLayoutAlign=\"space-around stretch\">\n <div class=\"mat-display-1 pad-top-sm\"\n fxFlex=\"55\">{{getDropletTypeCount('flow')}}</div>\n <div class=\"pad-top-sm\" fxFlex=\"45\">Flows</div>\n </div>\n </mat-button-toggle>\n <mat-button-toggle (change)=\"toggleDropletsFilter('compliant.label:Compliant')\"\n [checked]=\"isDropletFilterChecked('compliant.label:Compliant')\">\n <div fxFlex fxLayout=\"column\" fxLayoutAlign=\"space-around stretch\">\n <div class=\"mat-display-1 pad-top-sm\"\n fxFlex=\"55\">{{getDropletCertificationCount('compliant')}}</div>\n <div class=\"pad-top-sm\" fxFlex=\"45\">Compliant</div>\n </div>\n </mat-button-toggle>\n <mat-button-toggle (change)=\"toggleDropletsFilter('fleet.label:Fleet')\"\n [checked]=\"isDropletFilterChecked('fleet.label:Fleet')\">\n <div fxFlex fxLayout=\"column\" fxLayoutAlign=\"space-around stretch\">\n <div class=\"mat-display-1 pad-top-sm\"\n fxFlex=\"55\">{{getDropletCertificationCount('fleet')}}</div>\n <div class=\"pad-top-sm\" fxFlex=\"45\">Fleet</div>\n </div>\n </mat-button-toggle>\n <mat-button-toggle (change)=\"toggleDropletsFilter('prod.label:Production Ready')\"\n [checked]=\"isDropletFilterChecked('prod.label:Production Ready')\">\n <div fxFlex fxLayout=\"column\" fxLayoutAlign=\"space-around stretch\">\n <div class=\"mat-display-1 pad-top-sm\"\n fxFlex=\"55\">{{getDropletCertificationCount('prod')}}</div>\n <div class=\"pad-top-sm\" fxFlex=\"45\">Production Ready</div>\n </div>\n </mat-button-toggle>\n <mat-button-toggle (change)=\"toggleDropletsFilter('secure.label:Secure')\"\n [checked]=\"isDropletFilterChecked('secure.label:Secure')\">\n <div fxFlex fxLayout=\"column\" fxLayoutAlign=\"space-around stretch\">\n <div class=\"mat-display-1 pad-top-sm\"\n fxFlex=\"55\">{{getDropletCertificationCount('secure')}}</div>\n <div class=\"pad-top-sm\" fxFlex=\"45\">Secure</div>\n </div>\n </mat-button-toggle>\n </mat-button-toggle-group>\n <div id=\"fds-droplet-filter-clear-grouping-button-container\">\n <span *ngIf=\"dropletsSearchTerms.length > 0\"\n (click)=\"dropletsSearchTerms = [];filterDroplets(activeDropletColumn.name, activeDropletColumn.sortOrder);\"><i\n class=\"fa fa-plus-circle fa-rotate-45\" aria-hidden=\"true\"></i><span\n class=\"pad-left-sm link\">Clear Grouping</span></span>\n </div>\n </div>\n <div layout=\"row\" layout-align=\"space-between center\">\n <div flex fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <td-chips [(ngModel)]=\"dropletsSearchTerms\" [items]=\"autoCompleteDroplets\"\n (add)=\"filterDroplets(activeDropletColumn.name, activeDropletColumn.sortOrder);\"\n (remove)=\"filterDroplets(activeDropletColumn.name, activeDropletColumn.sortOrder);\"\n class=\"push-right-sm\"></td-chips>\n <span class=\"push-top-sm pad-right-sm\">Sort by:</span>\n <button class=\"push-top-sm\" color=\"fds-primary\" mat-raised-button\n [matMenuTriggerFor]=\"dropletGridSortMenu\">\n {{getSortBy()}}<i class=\"fa fa-caret-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <mat-menu class=\"fds-primary-dropdown-button-menu\" #dropletGridSortMenu=\"matMenu\"\n [overlapTrigger]=\"false\">\n <div *ngFor=\"let column of dropletColumns\">\n <button mat-menu-item *ngIf=\"column.sortable\"\n (click)=\"sortDroplets(column);\">{{column.label}} {{(column.sortOrder === 'ASC') ? 'DESC' : 'ASC'}}</button>\n </div>\n </mat-menu>\n </div>\n </div>\n <div class=\"pad-right-xxl pad-left-xxl\">\n <div *ngFor=\"let droplet of filteredDroplets\">\n <td-expansion-panel class=\"mat-elevation-z5\" label={{droplet.label}}\n sublabel={{droplet.sublabel}} [disabled]=\"disabled\">\n <ng-template td-expansion-panel-label>\n <div fxLayout=\"column\" fxLayoutAlign=\"space-between start\">\n <span class=\"md-title text-caps\">{{droplet.displayName}}</span>\n <span class=\"md-subhead\">{{droplet.type}}</span>\n </div>\n </ng-template>\n <ng-template td-expansion-panel-sublabel>\n <div fxLayout=\"row\" fxLayoutAlign=\"space-between center\">\n <div class=\"pad-right-xxl pad-left-xxl\" fxLayout=\"column\"\n fxLayoutAlign=\"space-between start\">\n <span class=\"text-upper\">Versions</span> {{droplet.versions.length}}\n </div>\n <div class=\"pad-right-xxl pad-left-xxl\" fxLayout=\"column\"\n fxLayoutAlign=\"space-between start\">\n <span class=\"text-upper\">Flows</span> {{droplet.flows.length}}\n </div>\n <div class=\"pad-right-xxl pad-left-xxl\" fxLayout=\"column\"\n fxLayoutAlign=\"space-between start\">\n <span class=\"text-upper\">Extensions</span> {{droplet.extensions.length}}\n </div>\n <div class=\"pad-right-xxl pad-left-xxl\" fxLayout=\"column\"\n fxLayoutAlign=\"space-between start\">\n <span class=\"text-upper\">Assests</span> {{droplet.assets.length}}\n </div>\n </div>\n </ng-template>\n <div class=\"mat-padding\">\n <div fxLayout=\"column\" fxLayoutAlign=\"space-between stretch\">\n <div class=\"pad-bottom-sm\" fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <button color=\"fds-primary\"\n [matMenuTriggerFor]=\"primaryButtonDropdownMenu\"\n mat-raised-button>\n Actions<i class=\"fa fa-caret-down\" aria-hidden=\"true\"></i>\n </button>\n <mat-menu class=\"fds-primary-dropdown-button-menu\"\n #primaryButtonDropdownMenu=\"matMenu\" [overlapTrigger]=\"false\">\n <button mat-menu-item *ngFor=\"let action of droplet.actions\">\n <span>{{action.name}}</span>\n </button>\n </mat-menu>\n </div>\n <div fxLayout=\"row\">\n <div fxFlex=\"25\">\n <span class=\"text-upper\">Description</span>\n <p>Blah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah\n blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla\n bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah\n bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah\n blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla,\n blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla,\n bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah\n blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah\n blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla\n bla, blah blah bla</p>\n </div>\n <div fxFlex=\"50\">\n <mat-card fxFlex>\n <mat-card-content class=\"pad-top-sm\">\n <img src=\"{{droplet.img}}\">\n </mat-card-content>\n </mat-card>\n </div>\n <div fxFlex=\"25\">\n <span class=\"text-upper\">Change Log</span>\n </div>\n </div>\n </div>\n </div>\n </td-expansion-panel>\n <div class=\"pad-bottom-sm\"></div>\n </div>\n </div>\n </mat-tab>\n <mat-tab>\n <ng-template mat-tab-label>Code</ng-template>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <div class=\"pad-top-md pad-bottom-md pad-right-xxl pad-left-xxl\">\n <div class=\"pad-top-md pad-bottom-sm\">\n <mat-button-toggle-group fxLayout=\"row\" fxLayoutAlign=\"space-between center\"\n class=\"expansion-panel-filter-toggle-group\" multiple>\n <mat-button-toggle (change)=\"toggleDropletsFilter('type:asset')\"\n [checked]=\"isDropletFilterChecked('type:asset')\">\n <div fxFlex fxLayout=\"column\" fxLayoutAlign=\"space-around stretch\">\n <div class=\"mat-display-1 pad-top-sm\" fxFlex=\"55\">{ {getDropletTypeCount('asset')} }</div>\n <div class=\"pad-top-sm\" fxFlex=\"45\">Assets</div>\n </div>\n </mat-button-toggle>\n <mat-button-toggle (change)=\"toggleDropletsFilter('type:extension')\"\n [checked]=\"isDropletFilterChecked('type:extension')\">\n <div fxFlex fxLayout=\"column\" fxLayoutAlign=\"space-around stretch\">\n <div class=\"mat-display-1 pad-top-sm\" fxFlex=\"55\">{\n {getDropletTypeCount('extension')} }</div>\n <div class=\"pad-top-sm\" fxFlex=\"45\">Extensions</div>\n </div>\n </mat-button-toggle>\n <mat-button-toggle (change)=\"toggleDropletsFilter('type:flow')\"\n [checked]=\"isDropletFilterChecked('type:flow')\">\n <div fxFlex fxLayout=\"column\" fxLayoutAlign=\"space-around stretch\">\n <div class=\"mat-display-1 pad-top-sm\" fxFlex=\"55\">{ {getDropletTypeCount('flow')} }</div>\n <div class=\"pad-top-sm\" fxFlex=\"45\">Flows</div>\n </div>\n </mat-button-toggle>\n <mat-button-toggle (change)=\"toggleDropletsFilter('compliant.label:Compliant')\"\n [checked]=\"isDropletFilterChecked('compliant.label:Compliant')\">\n <div fxFlex fxLayout=\"column\" fxLayoutAlign=\"space-around stretch\">\n <div class=\"mat-display-1 pad-top-sm\" fxFlex=\"55\">{ {getDropletCertificationCount('compliant')} }</div>\n <div class=\"pad-top-sm\" fxFlex=\"45\">Compliant</div>\n </div>\n </mat-button-toggle>\n <mat-button-toggle (change)=\"toggleDropletsFilter('fleet.label:Fleet')\"\n [checked]=\"isDropletFilterChecked('fleet.label:Fleet')\">\n <div fxFlex fxLayout=\"column\" fxLayoutAlign=\"space-around stretch\">\n <div class=\"mat-display-1 pad-top-sm\" fxFlex=\"55\">{ {getDropletCertificationCount('fleet')} }</div>\n <div class=\"pad-top-sm\" fxFlex=\"45\">Fleet</div>\n </div>\n </mat-button-toggle>\n <mat-button-toggle (change)=\"toggleDropletsFilter('prod.label:Production Ready')\"\n [checked]=\"isDropletFilterChecked('prod.label:Production Ready')\">\n <div fxFlex fxLayout=\"column\" fxLayoutAlign=\"space-around stretch\">\n <div class=\"mat-display-1 pad-top-sm\" fxFlex=\"55\">{\n {getDropletCertificationCount('prod')} }</div>\n <div class=\"pad-top-sm\" fxFlex=\"45\">Production Ready</div>\n </div>\n </mat-button-toggle>\n <mat-button-toggle (change)=\"toggleDropletsFilter('secure.label:Secure')\"\n [checked]=\"isDropletFilterChecked('secure.label:Secure')\">\n <div fxFlex fxLayout=\"column\" fxLayoutAlign=\"space-around stretch\">\n <div class=\"mat-display-1 pad-top-sm\" fxFlex=\"55\">{ {getDropletCertificationCount('secure')} }</div>\n <div class=\"pad-top-sm\" fxFlex=\"45\">Secure</div>\n </div>\n </mat-button-toggle>\n </mat-button-toggle-group>\n <button *ngIf=\"activeDropletColumn\" mat-button color=\"primary\"\n (click)=\"dropletsSearchTerms = [];filterDroplets(activeDropletColumn.name, activeDropletColumn.sortOrder);\">Clear Grouping</button>\n </div>\n <div layout=\"row\" layout-align=\"space-between center\">\n <div flex fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <td-chips [(ngModel)]=\"dropletsSearchTerms\" [items]=\"autoCompleteDroplets\"\n (add)=\"filterDroplets(activeDropletColumn.name, activeDropletColumn.sortOrder);\"\n (remove)=\"filterDroplets(activeDropletColumn.name, activeDropletColumn.sortOrder);\"\n class=\"push-right-sm\"></td-chips>\n <span class=\"pad-right-sm\">Sort by:</span>\n <button color=\"fds-primary\" mat-raised-button [matMenuTriggerFor]=\"dropletGridSortMenu\">\n { {getSortBy()} }<i class=\"fa fa-caret-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <mat-menu class=\"fds-primary-dropdown-button-menu\" #dropletGridSortMenu=\"matMenu\"\n [overlapTrigger]=\"false\">\n <div *ngFor=\"let column of dropletColumns\">\n <button mat-menu-item *ngIf=\"column.sortable\" (click)=\"sortDroplets(column);\">{\n {column.label} } { {(column.sortOrder === 'ASC') ? 'DESC' : 'ASC'} }</button>\n </div>\n </mat-menu>\n </div>\n </div>\n <div class=\"pad-right-xxl pad-left-xxl\">\n <div *ngFor=\"let droplet of filteredDroplets\">\n <td-expansion-panel class=\"mat-elevation-z5\" label={ {droplet.label} } sublabel={ {droplet.sublabel} }\n [disabled]=\"disabled\">\n <ng-template td-expansion-panel-label>\n <div fxLayout=\"column\" fxLayoutAlign=\"space-between start\">\n <span class=\"md-title text-caps\">{ {droplet.displayName} }</span>\n <span class=\"md-subhead\">{ {droplet.type} }</span>\n </div>\n </ng-template>\n <ng-template td-expansion-panel-sublabel>\n <div fxLayout=\"row\" fxLayoutAlign=\"space-between center\">\n <div class=\"pad-right-xxl pad-left-xxl\" fxLayout=\"column\"\n fxLayoutAlign=\"space-between start\">\n <span class=\"text-upper\">Versions</span> { {droplet.versions.length} }\n </div>\n <div class=\"pad-right-xxl pad-left-xxl\" fxLayout=\"column\"\n fxLayoutAlign=\"space-between start\">\n <span class=\"text-upper\">Flows</span> { {droplet.flows.length} }\n </div>\n <div class=\"pad-right-xxl pad-left-xxl\" fxLayout=\"column\"\n fxLayoutAlign=\"space-between start\">\n <span class=\"text-upper\">Extensions</span> { {droplet.extensions.length} }\n </div>\n <div class=\"pad-right-xxl pad-left-xxl\" fxLayout=\"column\"\n fxLayoutAlign=\"space-between start\">\n <span class=\"text-upper\">Assests</span> { {droplet.assets.length} }\n </div>\n </div>\n </ng-template>\n <div class=\"mat-padding\">\n <div fxLayout=\"column\" fxLayoutAlign=\"space-between stretch\">\n <div class=\"pad-bottom-sm\" fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <button color=\"fds-primary\" [matMenuTriggerFor]=\"primaryButtonDropdownMenu\"\n mat-raised-button>\n Actions<i class=\"fa fa-caret-down\" aria-hidden=\"true\"></i>\n </button>\n <mat-menu class=\"fds-primary-dropdown-button-menu\" #primaryButtonDropdownMenu=\"matMenu\"\n [overlapTrigger]=\"false\">\n <button mat-menu-item *ngFor=\"let action of droplet.actions\">\n <span>{ {action.name} }</span>\n </button>\n </mat-menu>\n </div>\n <div fxLayout=\"row\">\n <div fxFlex=\"25\">\n <span class=\"text-upper\">Description</span>\n <p>Blah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah bla</p>\n </div>\n <div fxFlex=\"50\">\n <mat-card fxFlex>\n <mat-card-content class=\"pad-top-sm\">\n <img src=\"{ {droplet.img} }\">\n </mat-card-content>\n </mat-card>\n </div>\n <div fxFlex=\"25\">\n <span class=\"text-upper\">Change Log</span>\n </div>\n </div>\n </div>\n </div>\n </td-expansion-panel>\n <div class=\"pad-bottom-sm\"></div>\n </div>\n </div>\n ]]>\n </pre>\n <p>Javascript:</p>\n <pre lang=\"javascript\">\n <![CDATA[\n this.dataTableService = TdDataTableService;\n\n this.droplets = [\n {\n id: '23f6cc59-0156-1000-09b4-2b0610089090',\n name: \"Decompression_Circular_Flow\",\n displayName: 'Decompressed Circular flow',\n type: 'flow',\n sublabel: 'A sublabel',\n compliant: {\n id: '25fd6vv87-3549-0001-05g6-4d4567890765',\n label: 'Compliant',\n type: 'certification'\n },\n fleet: {\n id: '23f6cc59-3549-0001-05g6-4d4567890765',\n label: 'Fleet',\n type: 'certification'\n },\n prod: {\n id: '52fd6vv87-3549-0001-05g6-4d4567890765',\n label: 'Production Ready',\n type: 'certification'\n },\n secure: {\n id: '32f6cc59-3549-0001-05g6-4d4567890765',\n label: 'Secure',\n type: 'certification'\n },\n versions: [\n {\n id: '23f6cc59-0156-1000-06b4-2b0810089090',\n revision: '1',\n dependentFlows: [\n {\n id: '25fd6vv87-3549-0001-05g6-4d4567890765'\n }\n ],\n created: date.setDate(date.getDate() - 1),\n updated: new Date()\n }, {\n id: '25fd6vv87-3549-0001-05g6-4d4567890765',\n revision: '2',\n dependentFlows: [\n {\n id: '23f6cc59-0156-1000-06b4-2b0810089090'\n }\n ],\n created: new Date(),\n updated: new Date()\n }\n ],\n flows: [],\n extensions: [],\n assets: [],\n actions: [\n {\n 'name': 'Delete',\n 'icon': 'fa fa-close',\n 'tooltip': 'Delete User'\n },\n {\n 'name': 'Manage',\n 'icon': 'fa fa-user',\n 'tooltip': 'Manage User'\n },\n {\n 'name': 'Action 3',\n 'icon': 'fa fa-question',\n 'tooltip': 'Whatever else we want to do...'\n }\n ]\n },\n {\n id: '25fd6vv87-3249-0001-05g6-4d4767890765',\n name: \"DateConversion\",\n displayName: 'Date conversion',\n type: 'asset',\n sublabel: 'A sublabel',\n compliant: {\n id: '25fd6vv34-3549-0001-05g6-4d4567890765',\n label: 'Compliant',\n type: 'certification'\n },\n prod: {\n id: '52vn6vv87-3549-0001-05g6-4d4567890765',\n label: 'Production Ready',\n type: 'certification'\n },\n versions: [\n {\n id: '23f6ic59-0156-1000-06b4-2b0810089090',\n revision: '1',\n dependentFlows: [\n {\n id: '23f6cc19-0156-1000-06b4-2b0810089090'\n }\n ],\n created: new Date(),\n updated: new Date()\n }\n ],\n flows: [],\n extensions: [],\n assets: [],\n actions: [\n {\n 'name': 'Delete',\n 'icon': 'fa fa-close',\n 'tooltip': 'Delete User'\n }\n ]\n },\n {\n id: '52fd6vv87-3294-0001-05g6-4d4767890765',\n name: \"nifi-email-bundle\",\n displayName: 'nifi-email-bundle',\n type: 'extension',\n sublabel: 'A sublabel',\n compliant: {\n id: '33fd6vv87-3549-0001-05g6-4d4567890765',\n label: 'Compliant',\n test: {\n label: 'test'\n },\n type: 'certification'\n },\n versions: [\n {\n id: '23d3cc59-0156-1000-06b4-2b0810089090',\n revision: '1',\n dependentFlows: [\n {\n id: '23f6cc89-0156-1000-06b4-2b0810089090'\n }\n ],\n created: new Date(),\n updated: new Date()\n }\n ],\n flows: [],\n extensions: [],\n assets: [],\n actions: [\n {\n 'name': 'Delete',\n 'icon': 'fa fa-close',\n 'tooltip': 'Delete User'\n }, {\n 'name': 'Manage',\n 'icon': 'fa fa-user',\n 'tooltip': 'Manage User'\n }\n ]\n }];\n\n this.filteredDroplets = [];\n\n this.dropletColumns = [\n { name: 'id', label: 'ID', sortable: true },\n { name: 'name', label: 'Name', sortable: true },\n { name: 'displayName', label: 'Display Name', sortable: true },\n { name: 'sublabel', label: 'Label', sortable: true },\n { name: 'type', label: 'Type', sortable: true }\n ];\n\n this.autoCompleteDroplets = [];\n this.dropletsSearchTerms = [];\n\n ...\n\n isDropletFilterChecked: function(term) {\n return (this.dropletsSearchTerms.indexOf(term) > -1);\n },\n\n getDropletTypeCount: function(type) {\n return this.filteredDroplets.filter(function(droplet) {\n return droplet.type === type;\n }).length;\n },\n\n getDropletCertificationCount: function(certification) {\n return this.filteredDroplets.filter(droplet => {\n return Object.keys(droplet).find((key) => {\n if (key === certification && droplet[certification].type === 'certification') {\n return droplet;\n }\n });\n }).length;\n },\n\n getSortBy: function() {\n var sortByColumnLabel;\n var arrayLength = this.dropletColumns.length;\n for (var i = 0; i < arrayLength; i++) {\n if (this.dropletColumns[i].active === true) {\n sortByColumnLabel = this.dropletColumns[i].label;\n break;\n }\n }\n return sortByColumnLabel;\n },\n\n sortDroplets: function(column) {\n if (column.sortable === true) {\n // toggle column sort order\n var sortOrder = column.sortOrder = (column.sortOrder === 'ASC') ? 'DESC' : 'ASC';\n this.filterDroplets(column.name, sortOrder);\n\n //only one column can be actively sorted so we reset all to inactive\n this.dropletColumns.forEach(function (c) {\n c.active = false;\n });\n\n //and set this column as the actively sorted column\n column.active = true;\n this.activeDropletColumn = column;\n }\n },\n\n toggleDropletsFilter: function(searchTerm) {\n var applySearchTerm = true;\n // check if the search term is already applied and remove it if true\n if (this.dropletsSearchTerms.length > 0) {\n var arrayLength = this.dropletsSearchTerms.length;\n for (var i = 0; i < arrayLength; i++) {\n var index = this.dropletsSearchTerms.indexOf(searchTerm);\n if (index > -1) {\n this.dropletsSearchTerms.splice(index, 1);\n applySearchTerm = false;\n }\n }\n }\n\n // if we just removed the search term do NOT apply it again\n if (applySearchTerm) {\n this.dropletsSearchTerms.push(searchTerm);\n }\n\n this.filterDroplets(this.activeDropletColumn.name, this.activeDropletColumn.sortOrder);\n },\n\n filterDroplets: function(sortBy, sortOrder) {\n // if `sortBy` is `undefined` then find the first sortable column in this.dropletColumns\n if (sortBy === undefined) {\n var arrayLength = this.dropletColumns.length;\n for (var i = 0; i < arrayLength; i++) {\n if (this.dropletColumns[i].sortable === true) {\n sortBy = this.dropletColumns[i].name;\n this.activeDropletColumn = this.dropletColumns[i];\n\n //only one column can be actively sorted so we reset all to inactive\n this.dropletColumns.forEach(c => c.active = false);\n\n //and set this column as the actively sorted column\n this.dropletColumns[i].active = true;\n break;\n }\n }\n }\n\n // if `sortOrder` is `undefined` then use 'ASC'\n if (sortOrder === undefined) {\n sortOrder = 'ASC'\n }\n\n var newData = this.droplets;\n\n for (var i = 0; i < this.dropletsSearchTerms.length; i++) {\n newData = this.filterData(newData, this.dropletsSearchTerms[i], true, this.activeDropletColumn.name);\n }\n\n newData = this.dataTableService.sortData(newData, sortBy, sortOrder);\n this.filteredDroplets = newData;\n this.getAutoCompleteDroplets();\n },\n\n getAutoCompleteDroplets: function() {\n this.autoCompleteDroplets = [];\n this.dropletColumns.forEach(c => this.filteredDroplets.forEach(r => (r[c.name.toLowerCase()]) ? this.autoCompleteDroplets.push(r[c.name.toLowerCase()].toString()) : ''));\n },\n\n filterData: function(data, searchTerm, ignoreCase) {\n var field = '';\n if (searchTerm.indexOf(\":\") > -1) {\n field = searchTerm.split(':')[0].trim();\n searchTerm = searchTerm.split(':')[1].trim();\n }\n var filter = searchTerm ? (ignoreCase ? searchTerm.toLowerCase() : searchTerm) : '';\n\n if (filter) {\n data = data.filter(item => {\n var res = Object.keys(item).find((key) => {\n if (field.indexOf(\".\") > -1) {\n var objArray = field.split(\".\");\n var obj = item;\n var arrayLength = objArray.length;\n for (var i = 0; i < arrayLength; i++) {\n try {\n obj = obj[objArray[i]];\n } catch (e) {\n return false;\n }\n }\n var preItemValue = ('' + obj);\n var itemValue = ignoreCase ? preItemValue.toLowerCase() : preItemValue;\n return itemValue.indexOf(filter) > -1;\n } else {\n if (key !== field && field !== '') {\n return false;\n }\n var preItemValue = ('' + item[key]);\n var itemValue = ignoreCase ? preItemValue.toLowerCase() : preItemValue;\n return itemValue.indexOf(filter) > -1;\n }\n });\n return !(typeof res === 'undefined');\n });\n }\n return data;\n },\n\n ...\n ]]>\n </pre>\n </mat-tab>\n </mat-tab-group>\n </mat-card-content>\n <mat-divider></mat-divider>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"Table\">Table <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"Table\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <p>Example table with: Paging Bar / Filter / Sortable Columns / Multi-select with available Actions</p>\n <mat-tab-group mat-stretch-tabs color=\"accent\">\n <mat-tab>\n <ng-template mat-tab-label>Demo</ng-template>\n <div layout=\"row\" layout-align=\"space-between center\"\n class=\"pad-top-md pad-bottom-sm pad-left-md pad-right-md\">\n <span class=\"table-title\">\n <span>Table title</span>\n </span>\n <div flex class=\"push-right-sm\" fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <td-chips [items]=\"autoCompleteData\" (add)=\"searchAdd($event)\"\n (remove)=\"searchRemove($event)\"></td-chips>\n <button class=\"push-top-sm\" color=\"fds-primary\" mat-raised-button\n [matMenuTriggerFor]=\"dataTableActionMenu\">\n Actions<i class=\"fa fa-caret-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <mat-menu class=\"fds-primary-dropdown-button-menu\" #dataTableActionMenu=\"matMenu\"\n [overlapTrigger]=\"false\">\n <button mat-menu-item> Option 1</button>\n <button mat-menu-item> Option 2</button>\n </mat-menu>\n </div>\n <div class=\"pad-left-md pad-right-md\">\n <div fxLayout=\"row\" fxLayoutAlign=\"space-between center\" class=\"td-data-table\">\n <div class=\"td-data-table-column\" (click)=\"sort($event, column)\"\n [matTooltip]=\"column.tooltip\" *ngFor=\"let column of columns\"\n fxFlex=\"{{column.width}}\">\n <i *ngIf=\"column.active && column.sortable && column.sortOrder === 'ASC'\"\n class=\"fa fa-caret-up\" aria-hidden=\"true\"></i>\n <i *ngIf=\"column.active && column.sortable && column.sortOrder === 'DESC'\"\n class=\"fa fa-caret-down\" aria-hidden=\"true\"></i>\n {{column.label}}\n </div>\n <div class=\"td-data-table-column\" fxFlex=10>\n <div fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <mat-checkbox class=\"pad-left-sm\" [(ngModel)]=\"allRowsSelected\"\n (checked)=\"allRowsSelected\"\n (change)=\"toggleSelectAll()\"></mat-checkbox>\n </div>\n </div>\n </div>\n <div>\n <div fxLayout=\"row\" fxLayoutAlign=\"space-between center\" class=\"td-data-table-row\"\n [ngClass]=\"{'selected' : row.checked}\" *ngFor=\"let row of filteredData\"\n (click)=\"row.checked = !row.checked;toggleSelect(row)\">\n <div class=\"td-data-table-cell\" *ngFor=\"let column of columns\"\n fxFlex=\"{{column.width}}\">\n <div *ngIf=\"column.name !== 'comments' || row['comments']\">\n {{column.format ? column.format(row[column.name]) : row[column.name]}}\n </div>\n </div>\n <div class=\"td-data-table-cell\" fxFlex=10>\n <div *ngIf=\"row.actions\">\n <div *ngIf=\"row.actions.length <= 4\" fxLayout=\"row\"\n fxLayoutAlign=\"end center\">\n <button (click)=\"row.checked = !row.checked\"\n *ngFor=\"let action of row.actions\"\n matTooltip=\"{{action.tooltip}}\" mat-icon-button color=\"accent\"\n [disabled]=\"action.disabled ? '' : null\">\n <i class=\"{{action.icon}}\" aria-hidden=\"true\"></i>\n </button>\n <mat-checkbox class=\"pad-left-sm\" [(ngModel)]=\"row.checked\"\n [checked]=\"row.checked\" (change)=\"toggleSelect(row)\"\n (click)=\"row.checked = !row.checked;toggleSelect(row)\"></mat-checkbox>\n </div>\n <div *ngIf=\"row.actions.length > 4\" fxLayout=\"row\"\n fxLayoutAlign=\"end center\">\n <button (click)=\"row.checked = !row.checked\" matTooltip=\"Actions\"\n mat-icon-button color=\"accent\"\n [matMenuTriggerFor]=\"tableActionMenu\">\n <i class=\"fa fa-ellipsis-h\" aria-hidden=\"true\"></i>\n </button>\n <mat-menu #tableActionMenu=\"matMenu\" [overlapTrigger]=\"false\">\n <button *ngFor=\"let action of row.actions\"\n matTooltip=\"{{action.tooltip}}\" mat-menu-item\n [disabled]=\"action.disabled ? '' : null\">\n <i class=\"{{action.icon}}\" aria-hidden=\"true\"></i>\n <span>{{action.name}}</span>\n </button>\n </mat-menu>\n <mat-checkbox class=\"pad-left-sm\" [(ngModel)]=\"row.checked\"\n [checked]=\"row.checked\" (change)=\"toggleSelect(row)\"\n (click)=\"row.checked = !row.checked;toggleSelect(row)\"></mat-checkbox>\n </div>\n </div>\n <div *ngIf=\"!row.actions\" fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <mat-checkbox class=\"pad-left-sm\" [(ngModel)]=\"row.checked\"\n [checked]=\"row.checked\" (change)=\"toggleSelect(row)\"\n (click)=\"row.checked = !row.checked;toggleSelect(row)\"></mat-checkbox>\n </div>\n </div>\n </div>\n </div>\n <div class=\"mat-padding\" *ngIf=\"!filteredData.length > 0\" layout=\"row\"\n layout-align=\"center center\">\n <h3>No results to display.</h3>\n </div>\n <td-paging-bar #pagingBar [initialPage]=\"1\" [pageSize]=\"pageSize\" [total]=\"pageCount\"\n (change)=\"page($event)\">\n <span hide-xs>Row per page:</span> {{pagingBar.range}} <span\n hide-xs>of {{pagingBar.total}}</span>\n </td-paging-bar>\n </div>\n </mat-tab>\n <mat-tab>\n <ng-template mat-tab-label>Code</ng-template>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <div layout=\"row\" layout-align=\"space-between center\" class=\"pad-top-md pad-bottom-sm pad-left-md pad-right-md\">\n <span class=\"table-title\">\n <span>Table title</span>\n </span>\n <div flex class=\"push-right-sm\" fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <td-chips [items]=\"autoCompleteData\" (add)=\"searchAdd($event)\"\n (remove)=\"searchRemove($event)\"></td-chips>\n <button color=\"fds-primary\" mat-raised-button [matMenuTriggerFor]=\"dataTableActionMenu\">\n Actions<i class=\"fa fa-caret-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <mat-menu class=\"fds-primary-dropdown-button-menu\" #dataTableActionMenu=\"matMenu\" [overlapTrigger]=\"false\">\n <button mat-menu-item> Option 1 </button>\n <button mat-menu-item> Option 2 </button>\n </mat-menu>\n </div>\n <div class=\"pad-left-md pad-right-md\">\n <div fxLayout=\"row\" fxLayoutAlign=\"space-between center\" class=\"td-data-table\">\n <div class=\"td-data-table-column\" (click)=\"sort($event, column)\" [matTooltip]=\"column.tooltip\"\n *ngFor=\"let column of columns\" fxFlex=\"{ { column.width } }\">\n { { column.label } }\n <i *ngIf=\"column.active && column.sortable && column.sortOrder === 'ASC'\" class=\"fa fa-caret-up\"\n aria-hidden=\"true\"></i>\n <i *ngIf=\"column.active && column.sortable && column.sortOrder === 'DESC'\" class=\"fa fa-caret-down\"\n aria-hidden=\"true\"></i>\n </div>\n <div class=\"td-data-table-column\" fxFlex=10>\n <div fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <mat-checkbox class=\"pad-left-sm\" [(ngModel)]=\"allRowsSelected\" (checked)=\"allRowsSelected\"\n (change)=\"toggleSelectAll()\"></mat-checkbox>\n </div>\n </div>\n </div>\n <div>\n <div fxLayout=\"row\" fxLayoutAlign=\"space-between center\" class=\"td-data-table-row\"\n [ngClass]=\"{'selected' : row.checked}\" *ngFor=\"let row of filteredData\"\n (click)=\"row.checked = !row.checked;toggleSelect(row)\">\n <div class=\"td-data-table-cell\" *ngFor=\"let column of columns\" fxFlex=\"{ { column.width } }\">\n <div *ngIf=\"column.name !== 'comments' || row['comments']\">\n { { column.format ? column.format(row[column.name]) : row[column.name] } }\n </div>\n </div>\n <div class=\"td-data-table-cell\" fxFlex=10>\n <div *ngIf=\"row.actions\">\n <div *ngIf=\"row.actions.length <= 4\" fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <button (click)=\"row.checked = !row.checked\" *ngFor=\"let action of row.actions\"\n matTooltip=\"{ { action.tooltip } }\" mat-icon-button color=\"accent\"\n [disabled]=\"action.disabled ? '' : null\">\n <i class=\"{ { action.icon } }\" aria-hidden=\"true\"></i>\n </button>\n <mat-checkbox class=\"pad-left-sm\" [(ngModel)]=\"row.checked\" [checked]=\"row.checked\"\n (change)=\"toggleSelect(row)\"\n (click)=\"row.checked = !row.checked;toggleSelect(row)\"></mat-checkbox>\n </div>\n <div *ngIf=\"row.actions.length > 4\" fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <button (click)=\"row.checked = !row.checked\" matTooltip=\"Actions\" mat-icon-button\n color=\"accent\" [matMenuTriggerFor]=\"tableActionMenu\">\n <i class=\"fa fa-ellipsis-h\" aria-hidden=\"true\"></i>\n </button>\n <mat-menu #tableActionMenu=\"matMenu\" [overlapTrigger]=\"false\">\n <button *ngFor=\"let action of row.actions\" matTooltip=\"{ { action.tooltip } }\"\n mat-menu-item [disabled]=\"action.disabled ? '' : null\">\n <i class=\"{ { action.icon } }\" aria-hidden=\"true\"></i>\n <span>{ { action.name } }</span>\n </button>\n </mat-menu>\n <mat-checkbox class=\"pad-left-sm\" [(ngModel)]=\"row.checked\" [checked]=\"row.checked\"\n (change)=\"toggleSelect(row)\"\n (click)=\"row.checked = !row.checked;toggleSelect(row)\"></mat-checkbox>\n </div>\n </div>\n <div *ngIf=\"!row.actions\" fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <mat-checkbox class=\"pad-left-sm\" [(ngModel)]=\"row.checked\" [checked]=\"row.checked\"\n (change)=\"toggleSelect(row)\"\n (click)=\"row.checked = !row.checked;toggleSelect(row)\"></mat-checkbox>\n </div>\n </div>\n </div>\n </div>\n <div class=\"mat-padding\" *ngIf=\"!filteredData.length > 0\" layout=\"row\" layout-align=\"center center\">\n <h3>No results to display.</h3>\n </div>\n <td-paging-bar #pagingBar [initialPage]=\"1\" [pageSize]=\"pageSize\" [total]=\"pageCount\"\n (change)=\"page($event)\">\n <span hide-xs>Row per page:</span> { { pagingBar.range } } <span hide-xs>of {\n { pagingBar.total } }</span>\n </td-paging-bar>\n </div>\n ]]>\n </pre>\n <p>Javascript:</p>\n <pre lang=\"javascript\">\n <![CDATA[\n this.dataTableService = TdDataTableService;\n\n this.data = [\n {\n 'id': 1,\n 'name': 'Frozen yogurt',\n 'type': 'Ice cream',\n 'calories': 159.0,\n 'fat': 6.0,\n 'carbs': 24.0,\n 'protein': 4.0,\n 'sodium': 87.0,\n 'calcium': 14.0,\n 'iron': 1.0,\n 'comments': 'I love froyo!',\n 'actions': [\n {\n 'name': 'Action 1',\n 'icon': 'fa fa-user',\n 'tooltip': 'Manage Users'\n }, {\n 'name': 'Action 2',\n 'icon': 'fa fa-key',\n 'tooltip': 'Manage Permissions'\n }\n ]\n },\n {\n 'id': 2,\n 'name': 'Ice cream sandwich',\n 'type': 'Ice cream',\n 'calories': 237.0,\n 'fat': 9.0,\n 'carbs': 37.0,\n 'protein': 4.3,\n 'sodium': 129.0,\n 'calcium': 8.0,\n 'iron': 1.0,\n 'actions': [\n {\n 'name': 'Action 1',\n 'icon': 'fa fa-user',\n 'tooltip': 'Manage Users'\n }, {\n 'name': 'Action 2',\n 'icon': 'fa fa-key',\n 'tooltip': 'Manage Permissions'\n }, {\n 'name': 'Action 3',\n 'tooltip': 'Action 3'\n }, {\n 'name': 'Action 4',\n 'disabled': true,\n 'tooltip': 'Action 4'\n }, {\n 'name': 'Action 5',\n 'tooltip': 'Action 5'\n }\n ]\n },\n {\n 'id': 3,\n 'name': 'Eclair',\n 'type': 'Pastry',\n 'calories': 262.0,\n 'fat': 16.0,\n 'carbs': 24.0,\n 'protein': 6.0,\n 'sodium': 337.0,\n 'calcium': 6.0,\n 'iron': 7.0,\n 'actions': [{\n 'name': 'Action 1',\n 'icon': 'fa fa-user',\n 'tooltip': 'Manage Users'\n }, {\n 'name': 'Action 2',\n 'icon': 'fa fa-key',\n 'tooltip': 'Manage Permissions'\n }, {\n 'name': 'Action 3',\n 'tooltip': 'Action 3'\n }, {\n 'name': 'Action 4',\n 'disabled': true,\n 'tooltip': 'Action 4'\n }, {\n 'name': 'Action 5',\n 'tooltip': 'Action 5'\n }\n ],\n },\n {\n 'id': 4,\n 'name': 'Cupcake',\n 'type': 'Pastry',\n 'calories': 305.0,\n 'fat': 3.7,\n 'carbs': 67.0,\n 'protein': 4.3,\n 'sodium': 413.0,\n 'calcium': 3.0,\n 'iron': 8.0,\n 'actions': [{\n 'name': 'Action 1',\n 'icon': 'fa fa-user',\n 'tooltip': 'Manage Users'\n }, {\n 'name': 'Action 2',\n 'icon': 'fa fa-key',\n 'tooltip': 'Manage Permissions'\n }, {\n 'name': 'Action 3',\n 'tooltip': 'Action 3'\n }, {\n 'name': 'Action 4',\n 'disabled': true,\n 'tooltip': 'Action 4'\n }, {\n 'name': 'Action 5',\n 'tooltip': 'Action 5'\n }\n ],\n },\n {\n 'id': 5,\n 'name': 'Jelly bean',\n 'type': 'Candy',\n 'calories': 375.0,\n 'fat': 0.0,\n 'carbs': 94.0,\n 'protein': 0.0,\n 'sodium': 50.0,\n 'calcium': 0.0,\n 'iron': 0.0,\n },\n {\n 'id': 6,\n 'name': 'Lollipop',\n 'type': 'Candy',\n 'calories': 392.0,\n 'fat': 0.2,\n 'carbs': 98.0,\n 'protein': 0.0,\n 'sodium': 38.0,\n 'calcium': 0.0,\n 'iron': 2.0,\n },\n {\n 'id': 7,\n 'name': 'Honeycomb',\n 'type': 'Other',\n 'calories': 408.0,\n 'fat': 3.2,\n 'carbs': 87.0,\n 'protein': 6.5,\n 'sodium': 562.0,\n 'calcium': 0.0,\n 'iron': 45.0,\n },\n {\n 'id': 8,\n 'name': 'Donut',\n 'type': 'Pastry',\n 'calories': 452.0,\n 'fat': 25.0,\n 'carbs': 51.0,\n 'protein': 4.9,\n 'sodium': 326.0,\n 'calcium': 2.0,\n 'iron': 22.0,\n },\n {\n 'id': 9,\n 'name': 'KitKat',\n 'type': 'Candy',\n 'calories': 518.0,\n 'fat': 26.0,\n 'carbs': 65.0,\n 'protein': 7.0,\n 'sodium': 54.0,\n 'calcium': 12.0,\n 'iron': 6.0,\n },\n {\n 'id': 10,\n 'name': 'Chocolate',\n 'type': 'Candy',\n 'calories': 518.0,\n 'fat': 26.0,\n 'carbs': 65.0,\n 'protein': 7.0,\n 'sodium': 54.0,\n 'calcium': 12.0,\n 'iron': 6.0,\n },\n {\n 'id': 11,\n 'name': 'Chamoy',\n 'type': 'Candy',\n 'calories': 518.0,\n 'fat': 26.0,\n 'carbs': 65.0,\n 'protein': 7.0,\n 'sodium': 54.0,\n 'calcium': 12.0,\n 'iron': 6.0,\n }\n ];\n\n this.filteredData = this.data;\n this.filteredTotal = this.data.length;\n\n this.columns = [\n { name: 'comments', label: 'Comments' },\n { name: 'name', label: 'Dessert (100g serving)', sortable: true },\n { name: 'type', label: 'Type', sortable: true },\n { name: 'calories', label: 'Calories', numeric: true, format: NUMBER_FORMAT, sortable: true },\n { name: 'fat', label: 'Fat (g)', numeric: true, format: DECIMAL_FORMAT, sortable: true },\n { name: 'carbs', label: 'Carbs (g)', numeric: true, format: NUMBER_FORMAT, sortable: true },\n {\n name: 'protein', label: 'Protein (g)', numeric: true, format: DECIMAL_FORMAT, sortable: true },\n { name: 'sodium', label: 'Sodium (mg)', numeric: true, format: NUMBER_FORMAT, sortable: true },\n {name: 'calcium', label: 'Calcium (%)', numeric: true, format: NUMBER_FORMAT, sortable: true },\n { name: 'iron', label: 'Iron (%)', numeric: true, format: NUMBER_FORMAT },\n ];\n\n this.allRowsSelected = false;\n this.autoCompleteData = [];\n this.selectedRows = [];\n\n this.searchTerm = [];\n this.fromRow = 1;\n this.currentPage = 1;\n this.pageSize = 5;\n\n ...\n\n sort: function(sortEvent, column) {\n if (column.sortable) {\n var sortBy = column.name;\n var sortOrder = column.sortOrder = (column.sortOrder === 'ASC') ? 'DESC' : 'ASC';\n this.filter(sortBy, sortOrder);\n\n //only one column can be actively sorted so we reset all to inactive\n this.columns.forEach(c => c.active = false);\n\n //and set this column as the actively sorted column\n column.active = true;\n }\n },\n\n searchRemove: function(searchTerm) {\n //only remove the first occurrence of the search term\n var index = this.searchTerm.indexOf(searchTerm);\n if (index !== -1) {\n this.searchTerm.splice(index, 1);\n }\n this.filter();\n },\n\n searchAdd: function(searchTerm) {\n this.searchTerm.push(searchTerm);\n this.filter();\n },\n\n page: function(pagingEvent) {\n this.fromRow = pagingEvent.fromRow;\n this.currentPage = pagingEvent.page;\n this.pageSize = pagingEvent.pageSize;\n this.filter();\n },\n\n filterData: function(data, searchTerm, ignoreCase) {\n var field = '';\n if (searchTerm.indexOf(\":\") > -1) {\n field = searchTerm.split(':')[0].trim();\n searchTerm = searchTerm.split(':')[1].trim();\n }\n var filter = searchTerm ? (ignoreCase ? searchTerm.toLowerCase() : searchTerm) : '';\n\n if (filter) {\n data = data.filter(item => {\n var res = Object.keys(item).find((key) => {\n if (field.indexOf(\".\") > -1) {\n var objArray = field.split(\".\");\n var obj = item;\n var arrayLength = objArray.length;\n for (var i = 0; i < arrayLength; i++) {\n try {\n obj = obj[objArray[i]];\n } catch (e) {\n return false;\n }\n }\n var preItemValue = ('' + obj);\n var itemValue = ignoreCase ? preItemValue.toLowerCase() : preItemValue;\n return itemValue.indexOf(filter) > -1;\n } else {\n if (key !== field && field !== '') {\n return false;\n }\n var preItemValue = ('' + item[key]);\n var itemValue = ignoreCase ? preItemValue.toLowerCase() : preItemValue;\n return itemValue.indexOf(filter) > -1;\n }\n });\n return !(typeof res === 'undefined');\n });\n }\n return data;\n },\n\n filter: function(sortBy, sortOrder) {\n if (this.allRowsSelected) {\n this.toggleSelectAll();\n }\n this.deselectAll();\n var newData = this.data;\n\n if (this.searchTerm.length > 0) {\n for (var i = 0; i < this.searchTerm.length; i++) {\n //account for column/field name specific search syntax\n if (this.searchTerm[i].indexOf(\":\") > -1) {\n newData = this.filterData(newData, this.searchTerm[i].split(':')[1].trim(), true, this.searchTerm[i].split(':')[0].trim());\n } else { //otherwise search all cells\n newData = this.filterData(newData, this.searchTerm[i], true);\n }\n }\n } else {\n newData = this.dataTableService.filterData(newData, '', true);\n }\n this.filteredTotal = newData.length;\n newData = this.dataTableService.sortData(newData, sortBy, sortOrder);\n newData = this.dataTableService.pageData(newData, this.fromRow, this.currentPage * this.pageSize);\n this.filteredData = newData;\n this.getAutoCompleteData();\n },\n\n toggleSelect: function(row) {\n if (!row.checked) {\n this.allRowsSelected = false;\n } else {\n if (this.allFilteredRowsSelected()) {\n this.allRowsSelected = true;\n } else {\n this.allRowsSelected = false;\n }\n }\n },\n\n toggleSelectAll: function() {\n this.allRowsSelected = !this.allRowsSelected;\n if (this.allRowsSelected) {\n this.selectAll();\n } else {\n this.deselectAll();\n }\n },\n\n selectAll: function() {\n this.filteredData.forEach(c => c.checked = true);\n },\n\n deselectAll: function() {\n this.filteredData.forEach(c => c.checked = false);\n },\n\n allFilteredRowsSelected: function() {\n var allFilteredRowsSelected = true;\n this.filteredData.forEach(function(c) {\n if (c.checked === undefined || c.checked === false) {\n allFilteredRowsSelected = false;\n }\n });\n\n return allFilteredRowsSelected;\n },\n\n areTooltipsOn: function() {\n return this.columns[0].hasOwnProperty('tooltip');\n },\n\n toggleTooltips: function() {\n if (this.columns[0].tooltip) {\n this.columns.forEach(c => delete c.tooltip);\n } else {\n this.columns.forEach(c => c.tooltip = `This is ${c.label}!`);\n }\n },\n\n openDataTablePrompt: function(row, name) {\n this.dialogService.openPrompt({\n message: 'Enter comment?',\n value: row[name],\n }).afterClosed().subscribe(value => {\n if (value !== undefined) {\n row[name] = value;\n }\n })\n },\n\n getAutoCompleteData: function() {\n this.autoCompleteData = [];\n this.columns.forEach(c => this.filteredData.forEach(r => (r[c.name.toLowerCase()]) ? this.autoCompleteData.push(r[c.name.toLowerCase()].toString()):''));\n },\n\n ...\n ]]>\n </pre>\n </mat-tab>\n </mat-tab-group>\n </mat-card-content>\n <mat-divider></mat-divider>\n <mat-card-actions>\n <button matTooltip=\"Column field name tooltips toggle.\" mat-button color=\"primary\" (click)=\"toggleTooltips()\" class=\"text-upper\">\n Tooltips ({{areTooltipsOn() ? 'ON' : 'OFF'}})\n </button>\n </mat-card-actions>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"Checkboxes\">Checkbox <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"Checkboxes\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <h3 class=\"md-title\">Basic Usage</h3>\n <mat-divider></mat-divider>\n <mat-list>\n <mat-list-item *ngFor=\"let grocery of groceries\">\n <mat-checkbox [checked]=\"grocery.bought\">\n {{grocery.name}}\n </mat-checkbox>\n </mat-list-item>\n </mat-list>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <!-- Basic Usage -->\n <mat-checkbox [checked]=\"grocery.bought\">\n { {grocery.name} }\n </mat-checkbox>\n ]]>\n </pre>\n <p>Javascript:</p>\n <pre lang=\"javascript\">\n <![CDATA[\n this.groceries = [\n {\n bought: true,\n name: 'Seitan',\n },\n {\n bought: false,\n name: 'Almond Meal Flour',\n },\n {\n bought: false,\n name: 'Organic Eggs',\n }\n ];\n ]]>\n </pre>\n <h3 class=\"md-title\">Usage within Forms</h3>\n <mat-divider></mat-divider>\n <form>\n <div layout=\"row\" layout-align=\"start center\">\n <mat-checkbox flex=\"initial\" [(ngModel)]=\"user.agreesToTOS\" name=\"agreesToTOS\">\n I agree to the terms\n </mat-checkbox>\n <button mat-raised-button color=\"fds-secondary\" [disabled]=\"!user.agreesToTOS\"\n class=\"pad-right-sm\" class=\"text-upper\">Sign Up\n </button>\n </div>\n <mat-divider></mat-divider>\n <div layout=\"row\" layout-align=\"start center\" class=\"pad-top-sm pad-bottom-sm\">\n <mat-checkbox labelPosition=\"after\">\n I come after my label.\n </mat-checkbox>\n </div>\n <mat-divider></mat-divider>\n <div layout=\"row\" layout-align=\"start center\" class=\"pad-top-sm pad-bottom-sm\">\n <mat-checkbox labelPosition=\"before\">\n I come before my label\n </mat-checkbox>\n </div>\n <mat-divider></mat-divider>\n </form>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <!-- Usage within Forms -->\n <form>\n <div layout=\"row\" layout-align=\"start center\">\n <mat-checkbox flex=\"initial\" [(ngModel)]=\"user.agreesToTOS\" name=\"agreesToTOS\">\n I agree to the terms\n </mat-checkbox>\n <button mat-raised-button color=\"fds-secondary\" [disabled]=\"!user.agreesToTOS\" class=\"pad-right-sm\"\n class=\"text-upper\">Sign Up</button>\n </div>\n <mat-divider></mat-divider>\n <div layout=\"row\" layout-align=\"start center\" class=\"pad-top-sm pad-bottom-sm\">\n <mat-checkbox labelPosition=\"after\">\n I come after my label.\n </mat-checkbox>\n </div>\n <mat-divider></mat-divider>\n <div layout=\"row\" layout-align=\"start center\" class=\"pad-top-sm pad-bottom-sm\">\n <mat-checkbox labelPosition=\"before\">\n I come before my label\n </mat-checkbox>\n </div>\n <mat-divider></mat-divider>\n </form>\n ]]>\n </pre>\n <p>Javascript:</p>\n <pre lang=\"javascript\">\n <![CDATA[\n this.user = {\n agreesToTOS: false\n };\n ]]>\n </pre>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"Radios\">Radios <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"Radios\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content layout=\"row\">\n <div flex=\"48\" class=\"pad-right\">\n <!-- Basic Radios -->\n <h3 class=\"md-title\">Basic Radios</h3>\n <mat-radio-group name=\"group1\">\n <mat-radio-button class=\"pad-right-sm\" name=\"group1\">Option 1</mat-radio-button>\n <mat-radio-button class=\"pad-right-sm\" name=\"group1\">Option 2</mat-radio-button>\n <mat-radio-button class=\"pad-right-sm\" name=\"group1\" disabled=\"true\">Option 3 (disabled)\n </mat-radio-button>\n </mat-radio-group>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <!-- Basic Radios -->\n <mat-radio-group name=\"group1\">\n <mat-radio-button class=\"pad-right-sm\" name=\"group1\">Option 1 </mat-radio-button>\n <mat-radio-button class=\"pad-right-sm\" name=\"group1\">Option 2 </mat-radio-button>\n <mat-radio-button class=\"pad-right-sm\" name=\"group1\" disabled=\"true\">Option 3 (disabled) </mat-radio-button>\n </mat-radio-group>\n ]]>\n </pre>\n </div>\n <div flex=\"48\">\n <!-- Dynamic Radios -->\n <h3 class=\"md-title\">Dynamic Radios</h3>\n <mat-radio-group name=\"more_options\" [(ngModel)]=\"favoriteSeason\">\n <mat-radio-button class=\"fds-radio pad-right-sm\" *ngFor=\"let season of seasonOptions\"\n name=\"more_options\" [value]=\"season\">\n {{season}}\n </mat-radio-button>\n </mat-radio-group>\n <p>Your favorite season is: <strong>{{favoriteSeason}}</strong></p>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <!-- Dynamic Radios -->\n <mat-radio-group name=\"more_options\" [(ngModel)]=\"favoriteSeason\">\n <mat-radio-button class=\"fds-radio\" *ngFor=\"let season of seasonOptions\" name=\"more_options\" [value]=\"season\">\n { {season} }\n </mat-radio-button>\n </mat-radio-group>\n <p>Your favorite season is: <strong>{ { favoriteSeason } }</strong></p>\n ]]>\n </pre>\n <p>Javascript:</p>\n <pre lang=\"javascript\">\n <![CDATA[\n\n this.favoriteSeason = 'Autumn';\n\n this.seasonOptions = [\n 'Winter',\n 'Spring',\n 'Summer',\n 'Autumn',\n ];\n ]]>\n </pre>\n </div>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"Tooltips\">Tooltips <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"Tooltips\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <button mat-raised-button color=\"fds-primary\" matTooltip=\"I show above\" matTooltipPosition=\"above\"\n class=\"text-upper\">Above Tooltip\n </button>\n <button mat-raised-button color=\"fds-primary\" matTooltip=\"I show after\" matTooltipPosition=\"after\"\n class=\"text-upper\">After Tooltip\n </button>\n <button mat-raised-button color=\"fds-primary\" matTooltip=\"I show below\" matTooltipPosition=\"below\"\n class=\"text-upper\">Below Tooltip\n </button>\n <button mat-raised-button color=\"fds-primary\" matTooltip=\"I show before\" matTooltipPosition=\"before\"\n class=\"text-upper\">Before Tooltip\n </button>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <button mat-raised-button color=\"fds-primary\" matTooltip=\"I show above\" matTooltipPosition=\"above\"\n class=\"text-upper\">Bottom Tooltip</button>\n <button mat-raised-button color=\"fds-primary\" matTooltip=\"I show after\" matTooltipPosition=\"after\"\n class=\"text-upper\">Bottom Tooltip</button>\n <button mat-raised-button color=\"fds-primary\" matTooltip=\"I show below\" matTooltipPosition=\"below\"\n class=\"text-upper\">Bottom Tooltip</button>\n <button mat-raised-button color=\"fds-primary\" matTooltip=\"I show before\" matTooltipPosition=\"before\"\n class=\"text-upper\">Bottom Tooltip</button>\n ]]>\n </pre>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"Panels\">Panels <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"Panels\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <h3 class=\"md-title\">Standard Card</h3>\n <mat-card>\n <button class=\"fds-panel-menu-button\" matTooltip=\"Standard Card Menu\" mat-icon-button\n [matMenuTriggerFor]=\"standardCardMenu\">\n <i class=\"fa fa-ellipsis-v \" aria-hidden=\"true\"></i>\n </button>\n <mat-menu class=\"primary-icon-button-menu\" #standardCardMenu=\"matMenu\" [overlapTrigger]=\"false\">\n <button mat-menu-item>\n <span>Option1</span>\n </button>\n <button mat-menu-item>\n <span>Option2</span>\n </button>\n </mat-menu>\n <mat-card-title class=\"pad-bottom-sm\">\n <span>Title</span>\n </mat-card-title>\n <mat-card-content>\n <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do tempor incididunt ut labore\n et dolore magna aliqua. Ut enim ad</p>\n </mat-card-content>\n <mat-card-actions fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <button mat-raised-button color=\"fds-primary\" class=\"text-upper\">Action</button>\n </mat-card-actions>\n </mat-card>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <!-- Basic Card -->\n <mat-card>\n <button class=\"fds-panel-menu-button\" matTooltip=\"Standard Card Menu\" mat-icon-button\n [matMenuTriggerFor]=\"standardCardMenu\">\n <i class=\"fa fa-ellipsis-v \" aria-hidden=\"true\"></i>\n </button>\n <mat-menu class=\"primary-icon-button-menu\" #standardCardMenu=\"matMenu\" [overlapTrigger]=\"false\">\n <button mat-menu-item>\n <span>Option1</span>\n </button>\n <button mat-menu-item>\n <span>Option2</span>\n </button>\n </mat-menu>\n <mat-card-title class=\"pad-bottom-sm\">\n <span>Title</span>\n </mat-card-title>\n <mat-card-content>\n <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do tempor incididunt ut labore et dolore magna aliqua. Ut enim ad</p>\n </mat-card-content>\n <mat-card-actions fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <button mat-raised-button color=\"fds-primary\" class=\"text-upper\">Action</button>\n </mat-card-actions>\n </mat-card>\n ]]>\n </pre>\n <h3 class=\"md-title\">Tabbed Card</h3>\n <mat-card>\n <button class=\"fds-panel-menu-button\" matTooltip=\"Standard Card Menu\" mat-icon-button\n [matMenuTriggerFor]=\"standardCardMenu\">\n <i class=\"fa fa-ellipsis-v \" aria-hidden=\"true\"></i>\n </button>\n <mat-menu class=\"primary-icon-button-menu\" #standardCardMenu=\"matMenu\" [overlapTrigger]=\"false\">\n <button mat-menu-item>\n <span>Option1</span>\n </button>\n <button mat-menu-item>\n <span>Option2</span>\n </button>\n </mat-menu>\n <mat-card-content>\n <mat-tab-group dynamicHeight color=\"accent\">\n <mat-tab>\n <ng-template mat-tab-label>One</ng-template>\n <h3 class=\"md-title\">First tab content</h3>\n <p>Plaid echo park knausgaard normcore franzen cronut. Pickled humblebrag tofu hoodie,\n umami salvia farm-to-table schlitz try-hard food truck knausgaard pabst. Yuccie\n portland jean shorts, authentic mixtape waistcoat gentrify blue bottle. Fixie\n kickstarter church-key small batch seitan, shabby chic vegan listicle before they\n sold out. Hammock raw denim flannel tousled seitan you probably haven't heard of\n them. Trust fund man bun pug, kickstarter artisan selvage letterpress cornhole tote\n bag butcher locavore. Affogato try-hard kickstarter seitan, DIY pickled hella godard\n pork belly four loko ugh.</p>\n </mat-tab>\n <mat-tab>\n <ng-template mat-tab-label>Two</ng-template>\n <h3 class=\"md-title\">Second tab content</h3>\n <p>Hashtag distillery skateboard man bun gochujang, salvia man braid art party meggings\n heirloom kitsch farm-to-table. Franzen beard fingerstache gentrify, heirloom\n portland ennui XOXO microdosing kitsch plaid. Chicharrones bushwick chia, banh mi\n irony tattooed hammock butcher shabby chic taxidermy semiotics marfa post-ironic.\n Blue bottle keffiyeh farm-to-table ennui, chambray pitchfork art party pinterest\n artisan pop-up. Etsy banjo marfa, blue bottle kombucha crucifix XOXO tousled beard.\n Tilde disrupt kale chips bicycle rights skateboard master cleanse hella shoreditch,\n meditation retro shabby chic vice heirloom. Etsy listicle vice actually, iPhone chia\n hoodie four loko.</p>\n </mat-tab>\n </mat-tab-group>\n </mat-card-content>\n <mat-card-actions fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <button mat-raised-button color=\"fds-primary\" class=\"text-upper\">Action</button>\n </mat-card-actions>\n </mat-card>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <!-- Basic Card -->\n <mat-card>\n <button class=\"fds-panel-menu-button\" matTooltip=\"Standard Card Menu\" mat-icon-button\n [matMenuTriggerFor]=\"standardCardMenu\">\n <i class=\"fa fa-ellipsis-v \" aria-hidden=\"true\"></i>\n </button>\n <mat-menu class=\"primary-icon-button-menu\" #standardCardMenu=\"matMenu\" [overlapTrigger]=\"false\">\n <button mat-menu-item>\n <span>Option1</span>\n </button>\n <button mat-menu-item>\n <span>Option2</span>\n </button>\n </mat-menu>\n <mat-card-content>\n <mat-tab-group dynamicHeight color=\"accent\">\n <mat-tab>\n <ng-template mat-tab-label>One</ng-template>\n <h3 class=\"md-title\">First tab content</h3>\n <p>Plaid echo park knausgaard normcore franzen cronut. Pickled humblebrag tofu hoodie, umami salvia farm-to-table schlitz try-hard food truck knausgaard pabst. Yuccie portland jean shorts, authentic mixtape waistcoat gentrify blue bottle. Fixie kickstarter church-key small batch seitan, shabby chic vegan listicle before they sold out. Hammock raw denim flannel tousled seitan you probably haven't heard of them. Trust fund man bun pug, kickstarter artisan selvage letterpress cornhole tote bag butcher locavore. Affogato try-hard kickstarter seitan, DIY pickled hella godard pork belly four loko ugh.</p>\n </mat-tab>\n <mat-tab>\n <ng-template mat-tab-label>Two</ng-template>\n <h3 class=\"md-title\">Second tab content</h3>\n <p>Hashtag distillery skateboard man bun gochujang, salvia man braid art party meggings heirloom kitsch farm-to-table. Franzen beard fingerstache gentrify, heirloom portland ennui XOXO microdosing kitsch plaid. Chicharrones bushwick chia, banh mi irony tattooed hammock butcher shabby chic taxidermy semiotics marfa post-ironic. Blue bottle keffiyeh farm-to-table ennui, chambray pitchfork art party pinterest artisan pop-up. Etsy banjo marfa, blue bottle kombucha crucifix XOXO tousled beard. Tilde disrupt kale chips bicycle rights skateboard master cleanse hella shoreditch, meditation retro shabby chic vice heirloom. Etsy listicle vice actually, iPhone chia hoodie four loko.</p>\n </mat-tab>\n </mat-tab-group>\n </mat-card-content>\n <mat-card-actions fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <button mat-raised-button color=\"fds-primary\" class=\"text-upper\">Action</button>\n </mat-card-actions>\n </mat-card>\n ]]>\n </pre>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"Select\">Select <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"Select\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <form>\n <div layout=\"row\" layout-margin>\n <mat-select color=\"accent\" floatPlaceholder=\"never\" placeholder=\"Favorite food\"\n [(ngModel)]=\"selectedValue\" name=\"food\">\n <mat-option *ngFor=\"let food of foods\" [value]=\"food.value\">\n {{food.viewValue}}\n </mat-option>\n </mat-select>\n </div>\n <div layout=\"row\" layout-margin>\n <div flex> Selected food value: {{selectedValue}} </div>\n </div>\n </form>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <form>\n <div layout=\"row\" layout-margin>\n <mat-select color=\"accent\" floatPlaceholder=\"never\" placeholder=\"Favorite food\"\n [(ngModel)]=\"selectedValue\" name=\"food\">\n <mat-option *ngFor=\"let food of foods\" [value]=\"food.value\">\n { {food.viewValue} }\n </mat-option>\n </mat-select>\n </div>\n <div layout=\"row\" layout-margin>\n <div flex> Selected food value: { {selectedValue} } </div>\n </div>\n </form>\n ]]>\n </pre>\n <p>Javascript:</p>\n <pre lang=\"javascript\">\n <![CDATA[\n this.selectedValue = '';\n\n this.foods = [\n { value: 'steak-0', viewValue: 'Steak' },\n { value: 'pizza-1', viewValue: 'Pizza' },\n { value: 'tacos-2', viewValue: 'Tacos' },\n ];\n ]]>\n </pre>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"Menus\">Menus (dropdowns) <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"Menus\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <button mat-icon-button [matMenuTriggerFor]=\"menu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #menu=\"matMenu\">\n <button mat-menu-item> Refresh </button>\n <button mat-menu-item> Settings </button>\n <button mat-menu-item> Help </button>\n <button mat-menu-item disabled> Sign Out </button>\n </mat-menu>\n <button color=\"fds-regular\" mat-raised-button [matMenuTriggerFor]=\"aboveMenu\">\n Above<i class=\"fa fa-caret-down\" aria-hidden=\"true\"></i>\n </button>\n <mat-menu yPosition=\"above\" #aboveMenu=\"matMenu\">\n <button mat-menu-item> Refresh </button>\n <button mat-menu-item> Settings </button>\n <button mat-menu-item> Help </button>\n <button mat-menu-item disabled> Sign Out </button>\n </mat-menu>\n <button color=\"fds-regular\" mat-raised-button [matMenuTriggerFor]=\"iconsMenu\">\n Icons in Menu<i class=\"fa fa-caret-down\" aria-hidden=\"true\"></i>\n </button>\n <mat-menu #iconsMenu=\"matMenu\" [overlapTrigger]=\"false\">\n <button mat-menu-item>\n <mat-icon>dialpad</mat-icon>\n <span>Redial</span>\n </button>\n <button mat-menu-item disabled>\n <mat-icon>voicemail</mat-icon>\n <span>Check voicemail</span>\n </button>\n <button mat-menu-item>\n <mat-icon>notifications_off</mat-icon>\n <span>Disable alerts</span>\n </button>\n </mat-menu>\n <button color=\"fds-primary\" [matMenuTriggerFor]=\"primaryButtonDropdownMenu\" mat-raised-button>\n FDS Primary<i class=\"fa fa-caret-down\" aria-hidden=\"true\"></i>\n </button>\n <mat-menu class=\"fds-primary-dropdown-button-menu\" #primaryButtonDropdownMenu=\"matMenu\" [overlapTrigger]=\"false\">\n <button mat-menu-item>\n <span>Option 1</span>\n </button>\n <button mat-menu-item disabled>\n <span>Option 2</span>\n </button>\n </mat-menu>\n <button color=\"fds-regular\" mat-raised-button [matMenuTriggerFor]=\"posXMenu\">\n Before<i class=\"fa fa-caret-down\" aria-hidden=\"true\"></i>\n </button>\n <mat-menu xPosition=\"before\" #posXMenu=\"matMenu\">\n <button mat-menu-item> Refresh </button>\n <button mat-menu-item> Settings </button>\n <button mat-menu-item> Help </button>\n <button mat-menu-item disabled> Sign Out </button>\n </mat-menu>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <button mat-icon-button [matMenuTriggerFor]=\"menu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #menu=\"matMenu\">\n <button mat-menu-item> Refresh </button>\n <button mat-menu-item> Settings </button>\n <button mat-menu-item> Help </button>\n <button mat-menu-item disabled> Sign Out </button>\n </mat-menu>\n <button color=\"fds-regular\" mat-raised-button [matMenuTriggerFor]=\"aboveMenu\">\n Above<i class=\"fa fa-caret-down\" aria-hidden=\"true\"></i>\n </button>\n <mat-menu yPosition=\"above\" #aboveMenu=\"matMenu\">\n <button mat-menu-item> Refresh </button>\n <button mat-menu-item> Settings </button>\n <button mat-menu-item> Help </button>\n <button mat-menu-item disabled> Sign Out </button>\n </mat-menu>\n <button color=\"fds-regular\" mat-raised-button [matMenuTriggerFor]=\"iconsMenu\">\n Icons in Menu<i class=\"fa fa-caret-down\" aria-hidden=\"true\"></i>\n </button>\n <mat-menu #iconsMenu=\"matMenu\" [overlapTrigger]=\"false\">\n <button mat-menu-item>\n <mat-icon>dialpad</mat-icon>\n <span>Redial</span>\n </button>\n <button mat-menu-item disabled>\n <mat-icon>voicemail</mat-icon>\n <span>Check voicemail</span>\n </button>\n <button mat-menu-item>\n <mat-icon>notifications_off</mat-icon>\n <span>Disable alerts</span>\n </button>\n </mat-menu>\n <button color=\"fds-primary\" [matMenuTriggerFor]=\"primaryButtonDropdownMenu\" mat-raised-button>\n FDS Primary<i class=\"fa fa-caret-down\" aria-hidden=\"true\"></i>\n </button>\n <mat-menu class=\"fds-primary-dropdown-button-menu\" #primaryButtonDropdownMenu=\"matMenu\" [overlapTrigger]=\"false\">\n <button mat-menu-item>\n <span>Option 1</span>\n </button>\n <button mat-menu-item disabled>\n <span>Option 2</span>\n </button>\n </mat-menu>\n <button color=\"fds-regular\" mat-raised-button [matMenuTriggerFor]=\"posXMenu\">\n Before<i class=\"fa fa-caret-down\" aria-hidden=\"true\"></i>\n </button>\n <mat-menu xPosition=\"before\" #posXMenu=\"matMenu\">\n <button mat-menu-item> Refresh </button>\n <button mat-menu-item> Settings </button>\n <button mat-menu-item> Help </button>\n <button mat-menu-item disabled> Sign Out </button>\n </mat-menu>\n ]]>\n </pre>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"Dialog\">Dialog <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"Dialog\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <button mat-raised-button color=\"fds-primary\" (click)=\"openDialog()\">Show simple dialog</button>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <button mat-raised-button color=\"fds-primary\" (click)=\"openDialog()\">Show simple dialog</button>\n ]]>\n </pre>\n <p>Javascript:</p>\n <pre lang=\"javascript\">\n <![CDATA[\n var ngCore = require('@angular/core');\n function DialogComponent() {};\n\n DialogComponent.prototype = {\n constructor: DialogComponent\n };\n\n DialogComponent.annotations = [\n new ngCore.Component({\n template: 'Hello Dialog'\n })];\n\n ...\n\n constructor(MatDialog) {\n this.dialog = MatDialog;\n }\n\n ...\n\n openDialog: function() {\n this.dialog.open(DialogComponent, {\n height: '50%', // can be px or %\n width: '60%', // can be px or %\n }\n );\n }\n\n ...\n\n ]]>\n </pre>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"SimpleDialogs\">Simple Dialogs <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"SimpleDialogs\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <div class=\"pad-left-sm\">\n <button mat-raised-button color=\"fds-primary\" (click)=\"openConfirm()\" class=\"text-upper\">Open\n Confirm\n </button>\n </div>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <button mat-button color=\"primary\" (click)=\"openConfirm()\" class=\"text-upper\">Open Confirm</button>\n ]]>\n </pre>\n <p>Javascript:</p>\n <pre lang=\"javascript\">\n <![CDATA[\n ...\n\n constructor(TdDialogService) {\n this.dialogService = TdDialogService\n }\n\n ...\n\n openConfirm: function() {\n this.dialogService.openConfirm({\n title: 'Confirm',\n message: 'This is how simple it is to create a confirm with this wrapper service. Do you agree?',\n cancelButton: 'Disagree',\n acceptButton: 'Agree',\n });\n },\n\n ...\n ]]>\n </pre>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"SnackBars\">Snack Bars <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"SnackBars\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <button mat-raised-button color=\"fds-primary\" (click)=\"showSuccessSnackBar()\">Success Snack Bar</button>\n <button mat-raised-button color=\"fds-primary\" (click)=\"showWarnSnackBar()\">Warning Snack Bar</button>\n <button mat-raised-button color=\"fds-primary\" (click)=\"showErrorSnackBar()\">Error Snack Bar</button>\n <button mat-raised-button color=\"fds-primary\" (click)=\"showRegularSnackBar()\">Regular Snack Bar</button>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <button mat-raised-button color=\"fds-primary\" (click)=\"showSuccessSnackBar()\">Success Snack Bar</button>\n <button mat-raised-button color=\"fds-primary\" (click)=\"showWarnSnackBar()\">Warning Snack Bar</button>\n <button mat-raised-button color=\"fds-primary\" (click)=\"showErrorSnackBar()\">Error Snack Bar</button>\n <button mat-raised-button color=\"fds-primary\" (click)=\"showRegularSnackBar()\">Regular Snack Bar</button>\n ]]>\n </pre>\n <p>Javascript:</p>\n <pre lang=\"javascript\">\n <![CDATA[\n ...\n\n constructor(FdsSnackBarService) {\n this.snackBarService = FdsSnackBarService;\n },\n\n ...\n\n /** Possible values for horizontalPosition on MatSnackBarConfig are 'start' | 'center' | 'end' | 'left' | 'right'. */\n /** Possible values for verticalPosition on MatSnackBarConfig are 'top' | 'bottom'. */\n /** Possible values for icon on MatSnackBarConfig are any available icons loaded on the page. */\n\n showSuccessSnackBar: function () {\n var snackBarRef = this.snackBarService.openCoaster({\n title: 'Success',\n message: 'Some help text regarding the successful event.',\n verticalPosition: 'top',\n horizontalPosition: 'right',\n icon: 'fa fa-check-circle-o',\n color: '#1EB475',\n duration: 3000\n });\n },\n\n showWarnSnackBar: function () {\n var snackBarRef = this.snackBarService.openCoaster({\n title: 'Warning',\n message: 'Some help text regarding the warning.',\n verticalPosition: 'top',\n horizontalPosition: 'left',\n icon: 'fa fa-exclamation-triangle',\n color: '#E98A40',\n duration: 3000\n });\n },\n\n showErrorSnackBar: function () {\n var snackBarRef = this.snackBarService.openCoaster({\n title: 'Error',\n message: 'Some help text regarding the critical error. This coaster will stay open until closed with the `x` or if another coaster is created.',\n verticalPosition: 'bottom',\n horizontalPosition: 'right',\n icon: 'fa fa-times-circle-o',\n color: '#EF6162'\n });\n },\n\n showRegularSnackBar: function () {\n var snackBarRef = this.snackBarService.openCoaster({\n title: 'Regular',\n message: 'Something interesting.',\n verticalPosition: 'bottom',\n horizontalPosition: 'left',\n color: '#808793',\n duration: 3000\n });\n },\n\n ...\n ]]>\n </pre>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"ExpansionPanels\">Expansion Panels <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"ExpansionPanels\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <p>Expand/Collapse Event for Expansion 1: {{expandCollapseExpansion1Msg}}</p>\n <div>\n <button mat-button color=\"primary\" (click)=\"toggleDisabled()\" class=\"text-upper\">Toggle disable\n </button>\n <button mat-button color=\"primary\" (click)=\"toggleExpansion1()\" class=\"text-upper\">Toggle first\n </button>\n </div>\n <div layout-gt-xs=\"row\" layout-align-gt-xs=\"center start\">\n <div flex-gt-xs=\"90\">\n <td-expansion-panel label=\"Google\"\n sublabel=\"1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA\"\n [expand]=\"expansion1\" [disabled]=\"disabled\"\n (expanded)=\"expandExpansion1Event()\"\n (collapsed)=\"collapseExpansion1Event()\">\n <td-expansion-summary>\n <mat-list>\n <mat-list-item>\n <mat-icon mat-list-avatar>pin_drop</mat-icon>\n <h3 mat-line>Google</h3>\n <h4 mat-line>Headquarters</h4>\n <p mat-line>\n 1600 Amphitheatre Pkwy\n <br/>Mountain View, CA 94043, USA\n </p>\n </mat-list-item>\n </mat-list>\n </td-expansion-summary>\n <div class=\"mat-padding\">\n <form class=\"mat-padding\" layout=\"column\">\n <mat-form-field floatLabel=\"always\" flex>\n <input matInput placeholder=\"Company (disabled)\" disabled value=\"Google\"/>\n </mat-form-field>\n <mat-form-field floatLabel=\"always\" flex>\n <textarea matInput placeholder=\"Description\" rows=\"4\"></textarea>\n </mat-form-field>\n </form>\n <div layout=\"row\" layout-margin layout-align=\"end center\">\n <button mat-button class=\"text-upper\">Cancel</button>\n <button mat-button color=\"accent\" class=\"text-upper\">Save</button>\n </div>\n </div>\n </td-expansion-panel>\n </div>\n </div>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <td-expansion-panel label=\"Google\" sublabel=\"1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA\"\n [expand]=\"expansion1\" [disabled]=\"disabled\" (expanded)=\"expandExpansion1Event()\"\n (collapsed)=\"collapseExpansion1Event()\">\n <td-expansion-summary>\n <mat-list>\n <mat-list-item>\n <mat-icon mat-list-avatar>pin_drop</mat-icon>\n <h3 mat-line>Google</h3>\n <h4 mat-line>Headquarters</h4>\n <p mat-line>\n 1600 Amphitheatre Pkwy\n <br/>Mountain View, CA 94043, USA\n </p>\n </mat-list-item>\n </mat-list>\n </td-expansion-summary>\n <div class=\"mat-padding\">\n <form class=\"mat-padding\" layout=\"column\">\n <mat-form-field floatLabel=\"always\" flex>\n <input matInput placeholder=\"Company (disabled)\" disabled value=\"Google\"/>\n </mat-form-field>\n <mat-form-field floatLabel=\"always\" flex>\n <textarea matInput placeholder=\"Description\" rows=\"4\"></textarea>\n </mat-form-field>\n </form>\n <mat-divider></mat-divider>\n <div layout=\"row\" layout-margin layout-align=\"end center\">\n <button mat-button class=\"text-upper\">Cancel</button>\n <button mat-button color=\"accent\" class=\"text-upper\">Save</button>\n </div>\n </div>\n </td-expansion-panel>\n ]]>\n </pre>\n <p>Javascript:</p>\n <pre lang=\"javascript\">\n <![CDATA[\n this.expandCollapseExpansion1Msg = 'No expanded/collapsed detected yet';\n this.expansion1 = false;\n this.disabled = false;\n\n ...\n\n toggleExpansion1: function() {\n if (!this.disabled) {\n this.expansion1 = !this.expansion1;\n }\n },\n\n toggleDisabled: function() {\n this.disabled = !this.disabled;\n },\n\n expandExpansion1Event: function() {\n this.expandCollapseExpansion1Msg = 'Expand event emitted.';\n },\n\n collapseExpansion1Event: function() {\n this.expandCollapseExpansion1Msg = 'Collapse event emitted.';\n },\n\n ...\n ]]>\n </pre>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"Progress\">Progress <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"Progress\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content layout=\"row\">\n <div flex=\"48\" class=\"pad-right\">\n <h3 class=\"md-title\">Progress Bars</h3>\n <h4>Determinate</h4>\n <mat-progress-bar mode=\"determinate\" value=\"40\"></mat-progress-bar>\n <h4>Indeterminate</h4>\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\n <h4>Buffer</h4>\n <mat-progress-bar mode=\"buffer\" value=\"15\" bufferValue=\"15\"></mat-progress-bar>\n <h4>Query</h4>\n <mat-progress-bar mode=\"query\"></mat-progress-bar>\n <h4>Colors</h4>\n <mat-progress-bar mode=\"indeterminate\" color=\"primary\"></mat-progress-bar>\n <mat-progress-bar mode=\"indeterminate\" color=\"accent\"></mat-progress-bar>\n <mat-progress-bar mode=\"indeterminate\" color=\"warn\"></mat-progress-bar>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <!-- Determinate-->\n <mat-progress-bar mode=\"determinate\" value=\"40\"></mat-progress-bar>\n\n <!-- Indeterminate-->\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\n\n <!-- Buffer-->\n <mat-progress-bar mode=\"buffer\" value=\"15\" bufferValue=\"15\"></mat-progress-bar>\n\n <!-- Query-->\n <mat-progress-bar mode=\"query\"></mat-progress-bar>\n\n <!-- Colors-->\n <mat-progress-bar mode=\"indeterminate\" color=\"primary\"></mat-progress-bar>\n\n <mat-progress-bar mode=\"indeterminate\" color=\"accent\"></mat-progress-bar>\n\n <mat-progress-bar mode=\"indeterminate\" color=\"warn\"></mat-progress-bar>\n ]]>\n </pre>\n </div>\n <div flex=\"48\">\n <!-- Progress circles-->\n <h3 class=\"md-title\">Progress Spinner</h3>\n <div layout=\"row\">\n <div>\n <h4>Determinate</h4>\n <mat-progress-spinner mode=\"determinate\" value=\"66\"></mat-progress-spinner>\n </div>\n <div>\n <h4>indeterminate</h4>\n <mat-progress-spinner mode=\"indeterminate\"></mat-progress-spinner>\n </div>\n <div>\n <h4>Spinner</h4>\n <mat-spinner></mat-spinner>\n </div>\n </div>\n <div>\n <h4>Colors</h4>\n <div layout=\"row\">\n <mat-progress-spinner mode=\"indeterminate\" color=\"primary\"></mat-progress-spinner>\n <mat-progress-spinner mode=\"indeterminate\" color=\"accent\"></mat-progress-spinner>\n <mat-progress-spinner mode=\"indeterminate\" color=\"warn\"></mat-progress-spinner>\n </div>\n </div>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <!-- Determinate -->\n <mat-progress-spinner mode=\"determinate\" value=\"66\"></mat-progress-spinner>\n <!-- Indeterminate -->\n <mat-progress-spinner mode=\"indeterminate\"></mat-progress-spinner>\n <!-- Spinner -->\n <mat-spinner></mat-spinner>\n <!-- Colors -->\n <mat-progress-spinner mode=\"indeterminate\" color=\"primary\"></mat-progress-spinner>\n <mat-progress-spinner mode=\"indeterminate\" color=\"accent\"></mat-progress-spinner>\n <mat-progress-spinner mode=\"indeterminate\" color=\"warn\"></mat-progress-spinner>\n ]]>\n </pre>\n </div>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"SideNav\">Side Nav <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"SideNav\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <p>The side nav can be opened at the `start` or `end` of a container and can be displayed in `over`,\n `side`, or `push` mode. You can also define its width.</p>\n <button matTooltip=\"Open side nav\" mat-raised-button color=\"fds-primary\" (click)=\"sidenav.toggle()\">\n Open\n </button>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <!-- Basic Usage -->\n <mat-sidenav #sidenav mode=\"over\" align=\"end\" opened=\"false\">\n ...\n </mat-sidenav>\n ]]>\n </pre>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"SlideToggle\">Slide Toggle <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"SlideToggle\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <h3 class=\"md-title\">Basic Usage</h3>\n <mat-divider></mat-divider>\n <mat-list>\n <mat-list-item *ngFor=\"let system of systems\">\n <mat-slide-toggle [color]=\"system.color\" [(ngModel)]=\"system.on\">\n {{system.name}}\n </mat-slide-toggle>\n </mat-list-item>\n </mat-list>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <!-- Basic Usage -->\n <mat-list>\n <mat-list-item *ngFor=\"let system of systems\">\n <mat-slide-toggle [color]=\"system.color\" [(ngModel)]=\"system.on\">\n { {system.name} }\n </mat-slide-toggle>\n </mat-list-item>\n </mat-list>\n ]]>\n </pre>\n <p>Javascript:</p>\n <pre lang=\"javascript\">\n <![CDATA[\n this.systems = [{\n name: 'Lights',\n on: false,\n color: 'primary',\n }, {\n name: 'Surround Sound',\n on: true,\n color: 'accent',\n }, {\n name: 'T.V.',\n on: true,\n color: 'warn',\n }, ];\n ]]>\n </pre>\n <h3 class=\"md-title\">Usage within Forms</h3>\n <form>\n <mat-list>\n <mat-list-item>\n <mat-slide-toggle color=\"accent\" [(ngModel)]=\"house.lockHouse\" name=\"lockHouse\">\n Lock?\n </mat-slide-toggle>\n <mat-icon *ngIf=\"house.lockHouse\" class=\"pad-right-sm\">lock</mat-icon>\n </mat-list-item>\n <mat-list-item>\n <mat-slide-toggle disabled>\n I am disabled.\n </mat-slide-toggle>\n </mat-list-item>\n </mat-list>\n </form>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <!-- Usage within Forms -->\n <form>\n <mat-list>\n <mat-list-item>\n <mat-slide-toggle color=\"accent\" [(ngModel)]=\"house.lockHouse\" name=\"lockHouse\">\n Lock?\n </mat-slide-toggle>\n <mat-icon *ngIf=\"house.lockHouse\" class=\"pad-right-sm\">lock</mat-icon>\n </mat-list-item>\n <mat-list-item>\n <mat-slide-toggle disabled>\n I am disabled.\n </mat-slide-toggle>\n </mat-list-item>\n </mat-list>\n </form>\n ]]>\n </pre>\n <p>Javascript:</p>\n <pre lang=\"javascript\">\n <![CDATA[\n this.house = {\n lockHouse: false,\n };\n ]]>\n </pre>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"Slider\">Slider <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"Slider\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <h3 class=\"md-title\">Horizontal Slider</h3>\n <mat-slider min=\"1\" max=\"5\" thumbLabel tickInterval=\"1\" value=\"2\" color=\"primary\"></mat-slider>\n <mat-slider step=\"5\" thumbLabel tickInterval=\"5\" value=\"20\" color=\"accent\"></mat-slider>\n <mat-slider thumbLabel tick-interval=\"auto\" value=\"2\" color=\"warn\"></mat-slider>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <mat-slider min=\"1\" max=\"5\" thumbLabel tickInterval=\"1\" value=\"2\" color=\"primary\"></mat-slider>\n <mat-slider step=\"5\" thumbLabel tickInterval=\"5\" value=\"20\" color=\"accent\"></mat-slider>\n <mat-slider thumbLabel tick-interval=\"auto\" value=\"2\" color=\"warn\"></mat-slider>\n ]]>\n </pre>\n <h3 class=\"md-title\">Vertical Slider</h3>\n <mat-slider vertical min=\"1\" max=\"100\" thumbLabel tickInterval=\"10\" value=\"2\"></mat-slider>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <mat-slider vertical min=\"1\" max=\"100\" thumbLabel tickInterval=\"10\" value=\"2\"></mat-slider>\n ]]>\n </pre>\n <h3 class=\"md-title\">Inverted Slider</h3>\n <mat-slider invert min=\"1\" max=\"100\" thumbLabel tickInterval=\"10\" value=\"2\"></mat-slider>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <mat-slider invert min=\"1\" max=\"100\" thumbLabel tickInterval=\"10\" value=\"2\"></mat-slider>\n ]]>\n </pre>\n </mat-card-content>\n </mat-card>\n </div>\n</mat-sidenav-container>\n"; |
| |
| /***/ }), |
| |
| /***/ "./webapp/components/flow-design-system/fds-demo.js": |
| /*!**********************************************************!*\ |
| !*** ./webapp/components/flow-design-system/fds-demo.js ***! |
| \**********************************************************/ |
| /*! exports provided: default */ |
| /***/ (function(module, __webpack_exports__, __webpack_require__) { |
| |
| "use strict"; |
| __webpack_require__.r(__webpack_exports__); |
| /* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js"); |
| /* harmony import */ var _covalent_core_data_table__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @covalent/core/data-table */ "./node_modules/@covalent/core/fesm5/covalent-core-data-table.js"); |
| /* harmony import */ var _angular_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @angular/material */ "./node_modules/@angular/material/esm5/material.es5.js"); |
| /* harmony import */ var _nifi_fds_core__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @nifi-fds/core */ "./platform/core/index.js"); |
| /* harmony import */ var webapp_services_fds_service_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! webapp/services/fds.service.js */ "./webapp/services/fds.service.js"); |
| /* harmony import */ var webapp_components_flow_design_system_dialogs_demo_fds_demo_dialog_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! webapp/components/flow-design-system/dialogs/demo/fds-demo-dialog.js */ "./webapp/components/flow-design-system/dialogs/demo/fds-demo-dialog.js"); |
| function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the 'License'); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an 'AS IS' BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| |
| |
| |
| |
| |
| |
| var NUMBER_FORMAT = function NUMBER_FORMAT(v) { |
| return v; |
| }; |
| |
| var DECIMAL_FORMAT = function DECIMAL_FORMAT(v) { |
| return v.toFixed(2); |
| }; |
| |
| var date = new Date(); |
| /** |
| * FdsDemo constructor. |
| * |
| * @param FdsSnackBarService The FDS snack bar service module. |
| * @param FdsService The FDS service module. |
| * @param dialog The angular material dialog module. |
| * @param TdDialogService The covalent dialog service module. |
| * @param TdDataTableService The covalent data table service module. |
| * @constructor |
| */ |
| |
| function FdsDemo(FdsSnackBarService, FdsService, dialog, TdDataTableService, FdsDialogService) { |
| this.fdsService = FdsService; //<editor-fold desc='Snack Bars'> |
| |
| this.snackBarService = FdsSnackBarService; //</editor-fold> |
| //<editor-fold desc='Dialog'> |
| |
| this.dialog = dialog; //</editor-fold> |
| //<editor-fold desc='Simple Dialogs'> |
| |
| this.dialogService = FdsDialogService; //</editor-fold> |
| //<editor-fold desc='Expansion Panel'> |
| |
| this.expandCollapseExpansion1Msg = 'No expanded/collapsed detected yet'; |
| this.expansion1 = false; |
| this.disabled = false; //</editor-fold> |
| //<editor-fold desc='Autocomplete'> |
| |
| this.currentState = ''; |
| this.reactiveStates = ''; |
| this.tdStates = []; |
| this.tdDisabled = false; |
| this.states = [{ |
| code: 'AL', |
| name: 'Alabama' |
| }, { |
| code: 'AK', |
| name: 'Alaska' |
| }, { |
| code: 'AZ', |
| name: 'Arizona' |
| }, { |
| code: 'AR', |
| name: 'Arkansas' |
| }, { |
| code: 'CA', |
| name: 'California' |
| }, { |
| code: 'CO', |
| name: 'Colorado' |
| }, { |
| code: 'CT', |
| name: 'Connecticut' |
| }, { |
| code: 'DE', |
| name: 'Delaware' |
| }, { |
| code: 'FL', |
| name: 'Florida' |
| }, { |
| code: 'GA', |
| name: 'Georgia' |
| }, { |
| code: 'HI', |
| name: 'Hawaii' |
| }, { |
| code: 'ID', |
| name: 'Idaho' |
| }, { |
| code: 'IL', |
| name: 'Illinois' |
| }, { |
| code: 'IN', |
| name: 'Indiana' |
| }, { |
| code: 'IA', |
| name: 'Iowa' |
| }, { |
| code: 'KS', |
| name: 'Kansas' |
| }, { |
| code: 'KY', |
| name: 'Kentucky' |
| }, { |
| code: 'LA', |
| name: 'Louisiana' |
| }, { |
| code: 'ME', |
| name: 'Maine' |
| }, { |
| code: 'MD', |
| name: 'Maryland' |
| }, { |
| code: 'MA', |
| name: 'Massachusetts' |
| }, { |
| code: 'MI', |
| name: 'Michigan' |
| }, { |
| code: 'MN', |
| name: 'Minnesota' |
| }, { |
| code: 'MS', |
| name: 'Mississippi' |
| }, { |
| code: 'MO', |
| name: 'Missouri' |
| }, { |
| code: 'MT', |
| name: 'Montana' |
| }, { |
| code: 'NE', |
| name: 'Nebraska' |
| }, { |
| code: 'NV', |
| name: 'Nevada' |
| }, { |
| code: 'NH', |
| name: 'New Hampshire' |
| }, { |
| code: 'NJ', |
| name: 'New Jersey' |
| }, { |
| code: 'NM', |
| name: 'New Mexico' |
| }, { |
| code: 'NY', |
| name: 'New York' |
| }, { |
| code: 'NC', |
| name: 'North Carolina' |
| }, { |
| code: 'ND', |
| name: 'North Dakota' |
| }, { |
| code: 'OH', |
| name: 'Ohio' |
| }, { |
| code: 'OK', |
| name: 'Oklahoma' |
| }, { |
| code: 'OR', |
| name: 'Oregon' |
| }, { |
| code: 'PA', |
| name: 'Pennsylvania' |
| }, { |
| code: 'RI', |
| name: 'Rhode Island' |
| }, { |
| code: 'SC', |
| name: 'South Carolina' |
| }, { |
| code: 'SD', |
| name: 'South Dakota' |
| }, { |
| code: 'TN', |
| name: 'Tennessee' |
| }, { |
| code: 'TX', |
| name: 'Texas' |
| }, { |
| code: 'UT', |
| name: 'Utah' |
| }, { |
| code: 'VT', |
| name: 'Vermont' |
| }, { |
| code: 'VA', |
| name: 'Virginia' |
| }, { |
| code: 'WA', |
| name: 'Washington' |
| }, { |
| code: 'WV', |
| name: 'West Virginia' |
| }, { |
| code: 'WI', |
| name: 'Wisconsin' |
| }, { |
| code: 'WY', |
| name: 'Wyoming' |
| }]; //</editor-fold> |
| //<editor-fold desc='Searchable Expansion Panels'> |
| |
| this.dataTableService = TdDataTableService; |
| this.droplets = [{ |
| id: '23f6cc59-0156-1000-09b4-2b0610089090', |
| name: 'Decompression_Circular_Flow', |
| displayName: 'Decompressed Circular flow', |
| type: 'flow', |
| sublabel: 'A sublabel', |
| compliant: { |
| id: '25fd6vv87-3549-0001-05g6-4d4567890765', |
| label: 'Compliant', |
| type: 'certification' |
| }, |
| fleet: { |
| id: '23f6cc59-3549-0001-05g6-4d4567890765', |
| label: 'Fleet', |
| type: 'certification' |
| }, |
| prod: { |
| id: '52fd6vv87-3549-0001-05g6-4d4567890765', |
| label: 'Production Ready', |
| type: 'certification' |
| }, |
| secure: { |
| id: '32f6cc59-3549-0001-05g6-4d4567890765', |
| label: 'Secure', |
| type: 'certification' |
| }, |
| versions: [{ |
| id: '23f6cc59-0156-1000-06b4-2b0810089090', |
| revision: '1', |
| dependentFlows: [{ |
| id: '25fd6vv87-3549-0001-05g6-4d4567890765' |
| }], |
| created: date.setDate(date.getDate() - 1), |
| updated: new Date() |
| }, { |
| id: '25fd6vv87-3549-0001-05g6-4d4567890765', |
| revision: '2', |
| dependentFlows: [{ |
| id: '23f6cc59-0156-1000-06b4-2b0810089090' |
| }], |
| created: new Date(), |
| updated: new Date() |
| }], |
| flows: [], |
| extensions: [], |
| assets: [], |
| actions: [{ |
| 'name': 'Delete', |
| 'icon': 'fa fa-close', |
| 'tooltip': 'Delete User' |
| }, { |
| 'name': 'Manage', |
| 'icon': 'fa fa-user', |
| 'tooltip': 'Manage User' |
| }, { |
| 'name': 'Action 3', |
| 'icon': 'fa fa-question', |
| 'tooltip': 'Whatever else we want to do...' |
| }] |
| }, { |
| id: '25fd6vv87-3249-0001-05g6-4d4767890765', |
| name: 'DateConversion', |
| displayName: 'Date conversion', |
| type: 'asset', |
| sublabel: 'A sublabel', |
| compliant: { |
| id: '25fd6vv34-3549-0001-05g6-4d4567890765', |
| label: 'Compliant', |
| type: 'certification' |
| }, |
| prod: { |
| id: '52vn6vv87-3549-0001-05g6-4d4567890765', |
| label: 'Production Ready', |
| type: 'certification' |
| }, |
| versions: [{ |
| id: '23f6ic59-0156-1000-06b4-2b0810089090', |
| revision: '1', |
| dependentFlows: [{ |
| id: '23f6cc19-0156-1000-06b4-2b0810089090' |
| }], |
| created: new Date(), |
| updated: new Date() |
| }], |
| flows: [], |
| extensions: [], |
| assets: [], |
| actions: [{ |
| 'name': 'Delete', |
| 'icon': 'fa fa-close', |
| 'tooltip': 'Delete User' |
| }] |
| }, { |
| id: '52fd6vv87-3294-0001-05g6-4d4767890765', |
| name: 'nifi-email-bundle', |
| displayName: 'nifi-email-bundle', |
| type: 'extension', |
| sublabel: 'A sublabel', |
| compliant: { |
| id: '33fd6vv87-3549-0001-05g6-4d4567890765', |
| label: 'Compliant', |
| test: { |
| label: 'test' |
| }, |
| type: 'certification' |
| }, |
| versions: [{ |
| id: '23d3cc59-0156-1000-06b4-2b0810089090', |
| revision: '1', |
| dependentFlows: [{ |
| id: '23f6cc89-0156-1000-06b4-2b0810089090' |
| }], |
| created: new Date(), |
| updated: new Date() |
| }], |
| flows: [], |
| extensions: [], |
| assets: [], |
| actions: [{ |
| 'name': 'Delete', |
| 'icon': 'fa fa-close', |
| 'tooltip': 'Delete User' |
| }, { |
| 'name': 'Manage', |
| 'icon': 'fa fa-user', |
| 'tooltip': 'Manage User' |
| }] |
| }]; |
| this.filteredDroplets = []; |
| this.dropletColumns = [{ |
| name: 'id', |
| label: 'ID', |
| sortable: true |
| }, { |
| name: 'name', |
| label: 'Name', |
| sortable: true |
| }, { |
| name: 'displayName', |
| label: 'Display Name', |
| sortable: true |
| }, { |
| name: 'sublabel', |
| label: 'Label', |
| sortable: true |
| }, { |
| name: 'type', |
| label: 'Type', |
| sortable: true |
| }]; |
| this.activeDropletColumn = this.dropletColumns[0]; |
| this.autoCompleteDroplets = []; |
| this.dropletsSearchTerms = []; //</editor-fold> |
| //<editor-fold desc='Data Tables'> |
| |
| this.data = [{ |
| 'id': 1, |
| 'name': 'Frozen yogurt', |
| 'type': 'Ice cream', |
| 'calories': 159.0, |
| 'fat': 6.0, |
| 'carbs': 24.0, |
| 'protein': 4.0, |
| 'sodium': 87.0, |
| 'calcium': 14.0, |
| 'iron': 1.0, |
| 'comments': 'I love froyo!', |
| 'actions': [{ |
| 'name': 'Action 1', |
| 'icon': 'fa fa-user', |
| 'tooltip': 'Manage Users' |
| }, { |
| 'name': 'Action 2', |
| 'icon': 'fa fa-key', |
| 'tooltip': 'Manage Permissions' |
| }] |
| }, { |
| 'id': 2, |
| 'name': 'Ice cream sandwich', |
| 'type': 'Ice cream', |
| 'calories': 237.0, |
| 'fat': 9.0, |
| 'carbs': 37.0, |
| 'protein': 4.3, |
| 'sodium': 129.0, |
| 'calcium': 8.0, |
| 'iron': 1.0, |
| 'actions': [{ |
| 'name': 'Action 1', |
| 'icon': 'fa fa-user', |
| 'tooltip': 'Manage Users' |
| }, { |
| 'name': 'Action 2', |
| 'icon': 'fa fa-key', |
| 'tooltip': 'Manage Permissions' |
| }, { |
| 'name': 'Action 3', |
| 'tooltip': 'Action 3' |
| }, { |
| 'name': 'Action 4', |
| 'disabled': true, |
| 'tooltip': 'Action 4' |
| }, { |
| 'name': 'Action 5', |
| 'tooltip': 'Action 5' |
| }] |
| }, { |
| 'id': 3, |
| 'name': 'Eclair', |
| 'type': 'Pastry', |
| 'calories': 262.0, |
| 'fat': 16.0, |
| 'carbs': 24.0, |
| 'protein': 6.0, |
| 'sodium': 337.0, |
| 'calcium': 6.0, |
| 'iron': 7.0, |
| 'actions': [{ |
| 'name': 'Action 1', |
| 'icon': 'fa fa-user', |
| 'tooltip': 'Manage Users' |
| }, { |
| 'name': 'Action 2', |
| 'icon': 'fa fa-key', |
| 'tooltip': 'Manage Permissions' |
| }, { |
| 'name': 'Action 3', |
| 'tooltip': 'Action 3' |
| }, { |
| 'name': 'Action 4', |
| 'disabled': true, |
| 'tooltip': 'Action 4' |
| }, { |
| 'name': 'Action 5', |
| 'tooltip': 'Action 5' |
| }] |
| }, { |
| 'id': 4, |
| 'name': 'Cupcake', |
| 'type': 'Pastry', |
| 'calories': 305.0, |
| 'fat': 3.7, |
| 'carbs': 67.0, |
| 'protein': 4.3, |
| 'sodium': 413.0, |
| 'calcium': 3.0, |
| 'iron': 8.0, |
| 'actions': [{ |
| 'name': 'Action 1', |
| 'icon': 'fa fa-user', |
| 'tooltip': 'Manage Users' |
| }, { |
| 'name': 'Action 2', |
| 'icon': 'fa fa-key', |
| 'tooltip': 'Manage Permissions' |
| }, { |
| 'name': 'Action 3', |
| 'tooltip': 'Action 3' |
| }, { |
| 'name': 'Action 4', |
| 'disabled': true, |
| 'tooltip': 'Action 4' |
| }, { |
| 'name': 'Action 5', |
| 'tooltip': 'Action 5' |
| }] |
| }, { |
| 'id': 5, |
| 'name': 'Jelly bean', |
| 'type': 'Candy', |
| 'calories': 375.0, |
| 'fat': 0.0, |
| 'carbs': 94.0, |
| 'protein': 0.0, |
| 'sodium': 50.0, |
| 'calcium': 0.0, |
| 'iron': 0.0 |
| }, { |
| 'id': 6, |
| 'name': 'Lollipop', |
| 'type': 'Candy', |
| 'calories': 392.0, |
| 'fat': 0.2, |
| 'carbs': 98.0, |
| 'protein': 0.0, |
| 'sodium': 38.0, |
| 'calcium': 0.0, |
| 'iron': 2.0 |
| }, { |
| 'id': 7, |
| 'name': 'Honeycomb', |
| 'type': 'Other', |
| 'calories': 408.0, |
| 'fat': 3.2, |
| 'carbs': 87.0, |
| 'protein': 6.5, |
| 'sodium': 562.0, |
| 'calcium': 0.0, |
| 'iron': 45.0 |
| }, { |
| 'id': 8, |
| 'name': 'Donut', |
| 'type': 'Pastry', |
| 'calories': 452.0, |
| 'fat': 25.0, |
| 'carbs': 51.0, |
| 'protein': 4.9, |
| 'sodium': 326.0, |
| 'calcium': 2.0, |
| 'iron': 22.0 |
| }, { |
| 'id': 9, |
| 'name': 'KitKat', |
| 'type': 'Candy', |
| 'calories': 518.0, |
| 'fat': 26.0, |
| 'carbs': 65.0, |
| 'protein': 7.0, |
| 'sodium': 54.0, |
| 'calcium': 12.0, |
| 'iron': 6.0 |
| }, { |
| 'id': 10, |
| 'name': 'Chocolate', |
| 'type': 'Candy', |
| 'calories': 518.0, |
| 'fat': 26.0, |
| 'carbs': 65.0, |
| 'protein': 7.0, |
| 'sodium': 54.0, |
| 'calcium': 12.0, |
| 'iron': 6.0 |
| }, { |
| 'id': 11, |
| 'name': 'Chamoy', |
| 'type': 'Candy', |
| 'calories': 518.0, |
| 'fat': 26.0, |
| 'carbs': 65.0, |
| 'protein': 7.0, |
| 'sodium': 54.0, |
| 'calcium': 12.0, |
| 'iron': 6.0 |
| }]; |
| this.filteredData = this.data; |
| this.filteredTotal = this.data.length; |
| this.columns = [{ |
| name: 'comments', |
| label: 'Comments', |
| width: 10 |
| }, { |
| name: 'name', |
| label: 'Dessert (100g serving)', |
| sortable: true, |
| width: 10 |
| }, { |
| name: 'type', |
| label: 'Type', |
| sortable: true, |
| width: 10 |
| }, { |
| name: 'calories', |
| label: 'Calories', |
| numeric: true, |
| format: NUMBER_FORMAT, |
| sortable: true, |
| width: 10 |
| }, { |
| name: 'fat', |
| label: 'Fat (g)', |
| numeric: true, |
| format: DECIMAL_FORMAT, |
| sortable: true, |
| width: 10 |
| }, { |
| name: 'carbs', |
| label: 'Carbs (g)', |
| numeric: true, |
| format: NUMBER_FORMAT, |
| sortable: true, |
| width: 10 |
| }, { |
| name: 'protein', |
| label: 'Protein (g)', |
| numeric: true, |
| format: DECIMAL_FORMAT, |
| sortable: true, |
| width: 10 |
| }, { |
| name: 'sodium', |
| label: 'Sodium (mg)', |
| numeric: true, |
| format: NUMBER_FORMAT, |
| sortable: true, |
| width: 10 |
| }, { |
| name: 'calcium', |
| label: 'Calcium (%)', |
| numeric: true, |
| format: NUMBER_FORMAT, |
| sortable: true, |
| width: 10 |
| }, { |
| name: 'iron', |
| label: 'Iron (%)', |
| numeric: true, |
| format: NUMBER_FORMAT, |
| width: 10 |
| }]; |
| this.allRowsSelected = false; |
| this.autoCompleteData = []; |
| this.selectedRows = []; |
| this.searchTerm = []; |
| this.fromRow = 1; |
| this.currentPage = 1; |
| this.pageSize = 5; |
| this.pageCount = 0; //</editor-fold> |
| //<editor-fold desc='Chips $ Autocomplete'> |
| |
| this.readOnly = false; |
| this.items = ['stepper', 'expansion-panel', 'markdown', 'highlight', 'loading', 'media', 'chips', 'http', 'json-formatter', 'pipes', 'need more?']; |
| this.itemsRequireMatch = this.items.slice(0, 6); //</editor-fold> |
| //<editor-fold desc='Radios'> |
| |
| this.favoriteSeason = 'Autumn'; |
| this.seasonOptions = ['Winter', 'Spring', 'Summer', 'Autumn']; //</editor-fold> |
| //<editor-fold desc='Select'> |
| |
| this.selectedValue = ''; |
| this.foods = [{ |
| value: 'steak-0', |
| viewValue: 'Steak' |
| }, { |
| value: 'pizza-1', |
| viewValue: 'Pizza' |
| }, { |
| value: 'tacos-2', |
| viewValue: 'Tacos' |
| }]; //</editor-fold> |
| //<editor-fold desc='Checkbox'> |
| |
| this.user = { |
| agreesToTOS: false |
| }; |
| this.groceries = [{ |
| bought: true, |
| name: 'Seitan' |
| }, { |
| bought: false, |
| name: 'Almond Meal Flour' |
| }, { |
| bought: false, |
| name: 'Organic Eggs' |
| }]; //</editor-fold> |
| //<editor-fold desc='Slide Toggle'> |
| |
| this.systems = [{ |
| name: 'Lights', |
| on: false, |
| color: 'primary' |
| }, { |
| name: 'Surround Sound', |
| on: true, |
| color: 'accent' |
| }, { |
| name: 'T.V.', |
| on: true, |
| color: 'warn' |
| }]; |
| this.house = { |
| lockHouse: false |
| }; //</editor-fold> |
| } |
| |
| FdsDemo.prototype = { |
| constructor: FdsDemo, |
| //<editor-fold desc='Autocomplete'> |
| displayFn: function displayFn(value) { |
| return value && _typeof(value) === 'object' ? value.name : value; |
| }, |
| filterStates: function filterStates(val) { |
| return val ? this.states.filter(function (s) { |
| return s.name.match(new RegExp(val, 'gi')); |
| }) : this.states; |
| }, |
| //</editor-fold> |
| //<editor-fold desc='Snack Bars'> |
| showSuccessSnackBar: function showSuccessSnackBar() { |
| this.snackBarService.openCoaster({ |
| title: 'Success', |
| message: 'Some help text regarding the successful event.', |
| verticalPosition: 'top', |
| horizontalPosition: 'right', |
| icon: 'fa fa-check-circle-o', |
| color: '#1EB475', |
| duration: 3000 |
| }); |
| }, |
| showWarnSnackBar: function showWarnSnackBar() { |
| this.snackBarService.openCoaster({ |
| title: 'Warning', |
| message: 'Some help text regarding the warning.', |
| verticalPosition: 'top', |
| horizontalPosition: 'left', |
| icon: 'fa fa-exclamation-triangle', |
| color: '#E98A40', |
| duration: 3000 |
| }); |
| }, |
| showErrorSnackBar: function showErrorSnackBar() { |
| this.snackBarService.openCoaster({ |
| title: 'Error', |
| message: 'Some help text regarding the critical error. This coaster will stay open until closed with the `x` or if another coaster is created.', |
| verticalPosition: 'bottom', |
| horizontalPosition: 'right', |
| icon: 'fa fa-times-circle-o', |
| color: '#EF6162' |
| }); |
| }, |
| showRegularSnackBar: function showRegularSnackBar() { |
| this.snackBarService.openCoaster({ |
| title: 'Regular', |
| message: 'Something interesting.', |
| verticalPosition: 'bottom', |
| horizontalPosition: 'left', |
| color: '#808793', |
| duration: 3000 |
| }); |
| }, |
| //</editor-fold> |
| //<editor-fold desc='Dialog'> |
| openDialog: function openDialog() { |
| this.dialog.open(webapp_components_flow_design_system_dialogs_demo_fds_demo_dialog_js__WEBPACK_IMPORTED_MODULE_5__["default"]); |
| }, |
| //</editor-fold> |
| //<editor-fold desc='Expansion Panel'> |
| toggleExpansion1: function toggleExpansion1() { |
| if (!this.disabled) { |
| this.expansion1 = !this.expansion1; |
| } |
| }, |
| toggleDisabled: function toggleDisabled() { |
| this.disabled = !this.disabled; |
| }, |
| expandExpansion1Event: function expandExpansion1Event() { |
| this.expandCollapseExpansion1Msg = 'Expand event emitted.'; |
| }, |
| collapseExpansion1Event: function collapseExpansion1Event() { |
| this.expandCollapseExpansion1Msg = 'Collapse event emitted.'; |
| }, |
| //</editor-fold> |
| //<editor-fold desc='Simple Dialogs'> |
| openAlert: function openAlert() { |
| this.dialogService.openAlert({ |
| title: 'Alert', |
| disableClose: true, |
| message: 'This is how simple it is to create an alert with this wrapper service.' |
| }); |
| }, |
| openConfirm: function openConfirm() { |
| this.dialogService.openConfirm({ |
| title: 'Confirm', |
| message: 'This is how simple it is to create a confirm with this wrapper service. Do you agree?', |
| cancelButton: 'Disagree', |
| acceptButton: 'Agree' |
| }); |
| }, |
| openPrompt: function openPrompt() { |
| this.dialogService.openPrompt({ |
| title: 'Prompt', |
| message: 'This is how simple it is to create a prompt with this wrapper service. Prompt something.', |
| value: 'Populated value', |
| cancelButton: 'Cancel', |
| acceptButton: 'Ok' |
| }); |
| }, |
| //</editor-fold> |
| //<editor-fold desc='Searchable Expansion Panels'> |
| isDropletFilterChecked: function isDropletFilterChecked(term) { |
| return this.dropletsSearchTerms.indexOf(term) > -1; |
| }, |
| getDropletTypeCount: function getDropletTypeCount(type) { |
| return this.filteredDroplets.filter(function (droplet) { |
| return droplet.type === type; |
| }).length; |
| }, |
| getDropletCertificationCount: function getDropletCertificationCount(certification) { |
| return this.filteredDroplets.filter(function (droplet) { |
| return Object.keys(droplet).find(function (key) { |
| if (key === certification && droplet[certification].type === 'certification') { |
| return droplet; |
| } |
| |
| return null; |
| }); |
| }).length; |
| }, |
| getSortBy: function getSortBy() { |
| var sortByColumnLabel; |
| var arrayLength = this.dropletColumns.length; |
| |
| for (var i = 0; i < arrayLength; i++) { |
| if (this.dropletColumns[i].active === true) { |
| sortByColumnLabel = this.dropletColumns[i].label; |
| break; |
| } |
| } |
| |
| return sortByColumnLabel; |
| }, |
| sortDroplets: function sortDroplets(column) { |
| if (column.sortable === true) { |
| // toggle column sort order |
| column.sortOrder = column.sortOrder === 'ASC' ? 'DESC' : 'ASC'; |
| var sortOrder = column.sortOrder; |
| this.filterDroplets(column.name, sortOrder); //only one column can be actively sorted so we reset all to inactive |
| |
| this.dropletColumns.forEach(function (c) { |
| c.active = false; |
| }); //and set this column as the actively sorted column |
| |
| column.active = true; |
| this.activeDropletColumn = column; |
| } |
| }, |
| toggleDropletsFilter: function toggleDropletsFilter(searchTerm) { |
| var applySearchTerm = true; // check if the search term is already applied and remove it if true |
| |
| if (this.dropletsSearchTerms.length > 0) { |
| var arrayLength = this.dropletsSearchTerms.length; |
| |
| for (var i = 0; i < arrayLength; i++) { |
| var index = this.dropletsSearchTerms.indexOf(searchTerm); |
| |
| if (index > -1) { |
| this.dropletsSearchTerms.splice(index, 1); |
| applySearchTerm = false; |
| } |
| } |
| } // if we just removed the search term do NOT apply it again |
| |
| |
| if (applySearchTerm) { |
| this.dropletsSearchTerms.push(searchTerm); |
| } |
| |
| this.filterDroplets(this.activeDropletColumn.name, this.activeDropletColumn.sortOrder); |
| }, |
| filterDroplets: function filterDroplets(sortBy, sortOrder) { |
| // if `sortOrder` is `undefined` then use 'ASC' |
| if (sortOrder === undefined) { |
| sortOrder = 'ASC'; |
| } // if `sortBy` is `undefined` then find the first sortable column in this.dropletColumns |
| |
| |
| if (sortBy === undefined) { |
| var arrayLength = this.dropletColumns.length; |
| |
| for (var i = 0; i < arrayLength; i++) { |
| if (this.dropletColumns[i].sortable === true) { |
| sortBy = this.dropletColumns[i].name; |
| this.activeDropletColumn = this.dropletColumns[i]; //only one column can be actively sorted so we reset all to inactive |
| |
| this.dropletColumns.forEach(function (c) { |
| c.active = false; |
| }); //and set this column as the actively sorted column |
| |
| this.dropletColumns[i].active = true; |
| this.dropletColumns[i].sortOrder = sortOrder; |
| break; |
| } |
| } |
| } |
| |
| var newData = this.droplets; |
| |
| for (var _i = 0; _i < this.dropletsSearchTerms.length; _i++) { |
| newData = this.filterData(newData, this.dropletsSearchTerms[_i], true, this.activeDropletColumn.name); |
| } |
| |
| newData = this.dataTableService.sortData(newData, sortBy, sortOrder); |
| this.filteredDroplets = newData; |
| this.getAutoCompleteDroplets(); |
| }, |
| getAutoCompleteDroplets: function getAutoCompleteDroplets() { |
| var self = this; |
| this.autoCompleteDroplets = []; |
| this.dropletColumns.forEach(function (c) { |
| self.filteredDroplets.forEach(function (r) { |
| return r[c.name.toLowerCase()] ? self.autoCompleteDroplets.push(r[c.name.toLowerCase()].toString()) : ''; |
| }); |
| }); |
| }, |
| //</editor-fold> |
| filterData: function filterData(data, searchTerm, ignoreCase) { |
| var field = ''; |
| |
| if (searchTerm.indexOf(':') > -1) { |
| field = searchTerm.split(':')[0].trim(); |
| searchTerm = searchTerm.split(':')[1].trim(); |
| } |
| |
| var filter = searchTerm ? ignoreCase ? searchTerm.toLowerCase() : searchTerm : ''; |
| |
| if (filter) { |
| data = data.filter(function (item) { |
| var res = Object.keys(item).find(function (key) { |
| if (field.indexOf('.') > -1) { |
| var objArray = field.split('.'); |
| var obj = item; |
| var arrayLength = objArray.length; |
| |
| for (var i = 0; i < arrayLength; i++) { |
| try { |
| obj = obj[objArray[i]]; |
| } catch (e) { |
| return false; |
| } |
| } |
| |
| var _preItemValue = '' + obj; |
| |
| var _itemValue = ignoreCase ? _preItemValue.toLowerCase() : _preItemValue; |
| |
| return _itemValue.indexOf(filter) > -1; |
| } |
| |
| if (key !== field && field !== '') { |
| return false; |
| } |
| |
| var preItemValue = '' + item[key]; |
| var itemValue = ignoreCase ? preItemValue.toLowerCase() : preItemValue; |
| return itemValue.indexOf(filter) > -1; |
| }); |
| return !(typeof res === 'undefined'); |
| }); |
| } |
| |
| return data; |
| }, |
| //<editor-fold desc='Data Tables'> |
| sort: function sort(sortEvent, column) { |
| if (column.sortable) { |
| var sortBy = column.name; |
| column.sortOrder = column.sortOrder === 'ASC' ? 'DESC' : 'ASC'; |
| var sortOrder = column.sortOrder; |
| this.filter(sortBy, sortOrder); //only one column can be actively sorted so we reset all to inactive |
| |
| this.columns.forEach(function (c) { |
| c.active = false; |
| }); //and set this column as the actively sorted column |
| |
| column.active = true; |
| } |
| }, |
| searchRemove: function searchRemove(searchTerm) { |
| //only remove the first occurrence of the search term |
| var index = this.searchTerm.indexOf(searchTerm); |
| |
| if (index !== -1) { |
| this.searchTerm.splice(index, 1); |
| } |
| |
| this.fromRow = 1; |
| this.currentPage = 1; |
| this.filter(); |
| }, |
| searchAdd: function searchAdd(searchTerm) { |
| this.searchTerm.push(searchTerm); |
| this.fromRow = 1; |
| this.currentPage = 1; |
| this.filter(); |
| }, |
| page: function page(pagingEvent) { |
| this.fromRow = pagingEvent.fromRow; |
| this.currentPage = pagingEvent.page; |
| this.pageSize = pagingEvent.pageSize; |
| this.allRowsSelected = false; |
| this.filter(); |
| }, |
| filter: function filter(sortBy, sortOrder) { |
| if (this.allRowsSelected) { |
| this.toggleSelectAll(); |
| } |
| |
| this.deselectAll(); |
| var newData = this.data; |
| |
| for (var i = 0; i < this.searchTerm.length; i++) { |
| newData = this.filterData(newData, this.searchTerm[i], true); |
| } |
| |
| this.filteredTotal = newData.length; |
| newData = this.dataTableService.sortData(newData, sortBy, sortOrder); |
| this.pageCount = newData.length; |
| newData = this.dataTableService.pageData(newData, this.fromRow, this.currentPage * this.pageSize); |
| this.filteredData = newData; |
| this.getAutoCompleteData(); |
| }, |
| toggleSelect: function toggleSelect(row) { |
| if (this.allFilteredRowsSelected()) { |
| this.allRowsSelected = true; |
| } else { |
| this.allRowsSelected = false; |
| } |
| }, |
| toggleSelectAll: function toggleSelectAll() { |
| if (this.allRowsSelected) { |
| this.selectAll(); |
| } else { |
| this.deselectAll(); |
| } |
| }, |
| selectAll: function selectAll() { |
| this.filteredData.forEach(function (c) { |
| c.checked = true; |
| }); |
| }, |
| deselectAll: function deselectAll() { |
| this.filteredData.forEach(function (c) { |
| c.checked = false; |
| }); |
| }, |
| allFilteredRowsSelected: function allFilteredRowsSelected() { |
| var allFilteredRowsSelected = true; |
| this.filteredData.forEach(function (c) { |
| if (c.checked === undefined || c.checked === false) { |
| allFilteredRowsSelected = false; |
| } |
| }); |
| return allFilteredRowsSelected; |
| }, |
| areTooltipsOn: function areTooltipsOn() { |
| return this.columns[0].hasOwnProperty('tooltip'); |
| }, |
| toggleTooltips: function toggleTooltips() { |
| if (this.columns[0].tooltip) { |
| this.columns.forEach(function (c) { |
| delete c.tooltip; |
| }); |
| } else { |
| this.columns.forEach(function (c) { |
| c.tooltip = 'This is ' + c.label + '!'; |
| }); |
| } |
| }, |
| openDataTablePrompt: function openDataTablePrompt(row, name) { |
| this.dialogService.openPrompt({ |
| message: 'Enter comment?', |
| value: row[name] |
| }).afterClosed().subscribe(function (value) { |
| if (value !== undefined) { |
| row[name] = value; |
| } |
| }); |
| }, |
| getAutoCompleteData: function getAutoCompleteData() { |
| var self = this; |
| this.autoCompleteData = []; |
| this.columns.forEach(function (c) { |
| self.filteredData.forEach(function (r) { |
| return r[c.name.toLowerCase()] ? self.autoCompleteData.push(r[c.name.toLowerCase()].toString()) : ''; |
| }); |
| }); |
| }, |
| //</editor-fold> |
| //<editor-fold desc='Chips $ Autocomplete'> |
| toggleReadOnly: function toggleReadOnly() { |
| this.readOnly = !this.readOnly; |
| }, |
| //</editor-fold> |
| //<editor-fold desc='Life Cycle Listeners'> |
| |
| /** |
| * Initialize the component |
| */ |
| ngOnInit: function ngOnInit() { |
| this.filter(); |
| this.filterDroplets(); |
| }, |
| |
| /** |
| * Respond after Angular checks the component's views and child views |
| */ |
| ngAfterViewChecked: function ngAfterViewChecked() { |
| this.fdsService.inProgress = false; |
| } //</editor-fold> |
| |
| }; |
| FdsDemo.annotations = [new _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"]({ |
| template: __webpack_require__(/*! ./fds-demo.html */ "./webapp/components/flow-design-system/fds-demo.html"), |
| animations: [_nifi_fds_core__WEBPACK_IMPORTED_MODULE_3__["FdsAnimations"].slideInLeftAnimation], |
| host: { |
| '[@routeAnimation]': 'routeAnimation' |
| } |
| })]; |
| FdsDemo.parameters = [_nifi_fds_core__WEBPACK_IMPORTED_MODULE_3__["FdsSnackBarService"], webapp_services_fds_service_js__WEBPACK_IMPORTED_MODULE_4__["default"], _angular_material__WEBPACK_IMPORTED_MODULE_2__["MatDialog"], _covalent_core_data_table__WEBPACK_IMPORTED_MODULE_1__["TdDataTableService"], _nifi_fds_core__WEBPACK_IMPORTED_MODULE_3__["FdsDialogService"]]; |
| /* harmony default export */ __webpack_exports__["default"] = (FdsDemo); |
| |
| /***/ }), |
| |
| /***/ "./webapp/fds-bootstrap.js": |
| /*!*********************************!*\ |
| !*** ./webapp/fds-bootstrap.js ***! |
| \*********************************/ |
| /*! no exports provided */ |
| /***/ (function(module, __webpack_exports__, __webpack_require__) { |
| |
| "use strict"; |
| __webpack_require__.r(__webpack_exports__); |
| /* harmony import */ var core_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js */ "./node_modules/core-js/index.js"); |
| /* harmony import */ var core_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js__WEBPACK_IMPORTED_MODULE_0__); |
| /* harmony import */ var zone_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! zone.js */ "./node_modules/zone.js/dist/zone.js"); |
| /* harmony import */ var zone_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(zone_js__WEBPACK_IMPORTED_MODULE_1__); |
| /* harmony import */ var hammerjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! hammerjs */ "./node_modules/hammerjs/hammer.js"); |
| /* harmony import */ var hammerjs__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(hammerjs__WEBPACK_IMPORTED_MODULE_2__); |
| /* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"); |
| /* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_3__); |
| /* harmony import */ var _angular_platform_browser_dynamic__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @angular/platform-browser-dynamic */ "./node_modules/@angular/platform-browser-dynamic/fesm5/platform-browser-dynamic.js"); |
| /* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js"); |
| /* harmony import */ var webapp_fds_module_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! webapp/fds.module.js */ "./webapp/fds.module.js"); |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| |
| |
| |
| |
| |
| // Comment out this line when developing to assert for unidirectional data flow |
| |
| Object(_angular_core__WEBPACK_IMPORTED_MODULE_5__["enableProdMode"])(); // Get the locale id from the global |
| |
| var locale = navigator.language; |
| var providers = []; // No locale or U.S. English: no translation providers so go ahead and bootstrap the app |
| |
| if (!locale || locale === 'en-US') { |
| Object(_angular_platform_browser_dynamic__WEBPACK_IMPORTED_MODULE_4__["platformBrowserDynamic"])().bootstrapModule(webapp_fds_module_js__WEBPACK_IMPORTED_MODULE_6__["default"], { |
| providers: providers |
| }); |
| } else { |
| //load the translation providers and bootstrap the module |
| var translationFile = '/locale/messages.' + locale + '.xlf'; |
| jquery__WEBPACK_IMPORTED_MODULE_3___default.a.ajax({ |
| url: translationFile |
| }).done(function (translations) { |
| // add providers if translation file for locale is loaded |
| if (translations) { |
| providers.push({ |
| provide: _angular_core__WEBPACK_IMPORTED_MODULE_5__["TRANSLATIONS"], |
| useValue: translations |
| }); |
| providers.push({ |
| provide: _angular_core__WEBPACK_IMPORTED_MODULE_5__["TRANSLATIONS_FORMAT"], |
| useValue: 'xlf' |
| }); |
| providers.push({ |
| provide: _angular_core__WEBPACK_IMPORTED_MODULE_5__["LOCALE_ID"], |
| useValue: locale |
| }); |
| } |
| |
| Object(_angular_platform_browser_dynamic__WEBPACK_IMPORTED_MODULE_4__["platformBrowserDynamic"])().bootstrapModule(webapp_fds_module_js__WEBPACK_IMPORTED_MODULE_6__["default"], { |
| providers: providers |
| }); |
| }).fail(function () { |
| Object(_angular_platform_browser_dynamic__WEBPACK_IMPORTED_MODULE_4__["platformBrowserDynamic"])().bootstrapModule(webapp_fds_module_js__WEBPACK_IMPORTED_MODULE_6__["default"], { |
| providers: providers |
| }); |
| }); |
| } |
| |
| /***/ }), |
| |
| /***/ "./webapp/fds.html": |
| /*!*************************!*\ |
| !*** ./webapp/fds.html ***! |
| \*************************/ |
| /*! no static exports found */ |
| /***/ (function(module, exports) { |
| |
| module.exports = "<!--\nLicensed to the Apache Software Foundation (ASF) under one or more\ncontributor license agreements. See the NOTICE file distributed with\nthis work for additional information regarding copyright ownership.\nThe ASF licenses this file to You under the Apache License, Version 2.0\n(the \"License\"); you may not use this file except in compliance with\nthe License. You may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n-->\n\n<mat-progress-spinner id=\"loading-spinner\" *ngIf=\"fdsService.inProgress\" mode=\"indeterminate\"></mat-progress-spinner>\n<mat-sidenav-container>\n <mat-sidenav #sidenav mode=\"over\" align=\"end\" opened=\"false\" disableClose=\"true\">\n <router-outlet name=\"sidenav\"></router-outlet>\n </mat-sidenav>\n <div id=\"fds-app-container\">\n <mat-toolbar id=\"fds-toolbar\">\n <!-- <img id=\"fds-logo\" src=\"fds/images/fds-logo-web-app.svg\"> -->\n <div *ngIf=\"fdsService.perspective !== 'login' && fdsService.perspective !== 'not-found'\" fxFlex=\"1 1 auto\" class=\"pad-left-xl\" [@flyInOut]=\"fdsService.breadCrumbState\">\n <span class=\"pointer\">{{fdsService.title}}</span>\n </div>\n </mat-toolbar>\n <div id=\"fds-perspectives-container\">\n <router-outlet></router-outlet>\n </div>\n </div>\n</mat-sidenav-container>\n"; |
| |
| /***/ }), |
| |
| /***/ "./webapp/fds.js": |
| /*!***********************!*\ |
| !*** ./webapp/fds.js ***! |
| \***********************/ |
| /*! exports provided: default */ |
| /***/ (function(module, __webpack_exports__, __webpack_require__) { |
| |
| "use strict"; |
| __webpack_require__.r(__webpack_exports__); |
| /* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js"); |
| /* harmony import */ var webapp_services_fds_service_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! webapp/services/fds.service.js */ "./webapp/services/fds.service.js"); |
| /* harmony import */ var _nifi_fds_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @nifi-fds/core */ "./platform/core/index.js"); |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| |
| |
| /** |
| * Fds constructor. |
| * |
| * @param fdsService The fds service. |
| * @param changeDetectorRef The change detector ref. |
| * @constructor |
| */ |
| |
| function Fds(fdsService, changeDetectorRef) { |
| this.fdsService = fdsService; |
| this.cd = changeDetectorRef; |
| } |
| |
| Fds.prototype = { |
| constructor: Fds, |
| |
| /** |
| * Initialize the component |
| */ |
| ngOnInit: function ngOnInit() { |
| this.fdsService.sidenav = this.sidenav; //ngCore.ViewChild |
| }, |
| |
| /** |
| * Since the child views are updating the fdsService values that are used to display |
| * the breadcrumbs in this component's view we need to manually detect changes at the correct |
| * point in the lifecycle. |
| */ |
| ngAfterViewChecked: function ngAfterViewChecked() { |
| this.cd.detectChanges(); |
| } |
| }; |
| Fds.annotations = [new _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"]({ |
| selector: 'fds-app', |
| template: __webpack_require__(/*! ./fds.html */ "./webapp/fds.html"), |
| queries: { |
| sidenav: new _angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewChild"]('sidenav') |
| }, |
| animations: [_nifi_fds_core__WEBPACK_IMPORTED_MODULE_2__["FdsAnimations"].flyInOutAnimation] |
| })]; |
| Fds.parameters = [webapp_services_fds_service_js__WEBPACK_IMPORTED_MODULE_1__["default"], _angular_core__WEBPACK_IMPORTED_MODULE_0__["ChangeDetectorRef"]]; |
| /* harmony default export */ __webpack_exports__["default"] = (Fds); |
| |
| /***/ }), |
| |
| /***/ "./webapp/fds.module.js": |
| /*!******************************!*\ |
| !*** ./webapp/fds.module.js ***! |
| \******************************/ |
| /*! exports provided: default */ |
| /***/ (function(module, __webpack_exports__, __webpack_require__) { |
| |
| "use strict"; |
| __webpack_require__.r(__webpack_exports__); |
| /* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js"); |
| /* harmony import */ var _nifi_fds_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @nifi-fds/core */ "./platform/core/index.js"); |
| /* harmony import */ var webapp_fds_routes_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! webapp/fds.routes.js */ "./webapp/fds.routes.js"); |
| /* harmony import */ var webapp_fds_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! webapp/fds.js */ "./webapp/fds.js"); |
| /* harmony import */ var webapp_components_flow_design_system_fds_demo_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! webapp/components/flow-design-system/fds-demo.js */ "./webapp/components/flow-design-system/fds-demo.js"); |
| /* harmony import */ var webapp_components_flow_design_system_dialogs_demo_fds_demo_dialog_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! webapp/components/flow-design-system/dialogs/demo/fds-demo-dialog.js */ "./webapp/components/flow-design-system/dialogs/demo/fds-demo-dialog.js"); |
| /* harmony import */ var webapp_services_fds_service_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! webapp/services/fds.service.js */ "./webapp/services/fds.service.js"); |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| |
| |
| |
| |
| |
| |
| |
| function FdsModule() {} |
| |
| FdsModule.prototype = { |
| constructor: FdsModule |
| }; |
| FdsModule.annotations = [new _angular_core__WEBPACK_IMPORTED_MODULE_0__["NgModule"]({ |
| imports: [_nifi_fds_core__WEBPACK_IMPORTED_MODULE_1__["FdsCoreModule"], webapp_fds_routes_js__WEBPACK_IMPORTED_MODULE_2__["default"]], |
| declarations: [webapp_fds_js__WEBPACK_IMPORTED_MODULE_3__["default"], webapp_components_flow_design_system_fds_demo_js__WEBPACK_IMPORTED_MODULE_4__["default"], webapp_components_flow_design_system_dialogs_demo_fds_demo_dialog_js__WEBPACK_IMPORTED_MODULE_5__["default"]], |
| entryComponents: [webapp_components_flow_design_system_dialogs_demo_fds_demo_dialog_js__WEBPACK_IMPORTED_MODULE_5__["default"]], |
| providers: [webapp_services_fds_service_js__WEBPACK_IMPORTED_MODULE_6__["default"]], |
| bootstrap: [webapp_fds_js__WEBPACK_IMPORTED_MODULE_3__["default"]] |
| })]; |
| /* harmony default export */ __webpack_exports__["default"] = (FdsModule); |
| |
| /***/ }), |
| |
| /***/ "./webapp/fds.routes.js": |
| /*!******************************!*\ |
| !*** ./webapp/fds.routes.js ***! |
| \******************************/ |
| /*! exports provided: default */ |
| /***/ (function(module, __webpack_exports__, __webpack_require__) { |
| |
| "use strict"; |
| __webpack_require__.r(__webpack_exports__); |
| /* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/fesm5/router.js"); |
| /* harmony import */ var webapp_components_flow_design_system_fds_demo_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! webapp/components/flow-design-system/fds-demo.js */ "./webapp/components/flow-design-system/fds-demo.js"); |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| |
| var FdsRoutes = _angular_router__WEBPACK_IMPORTED_MODULE_0__["RouterModule"].forRoot([{ |
| path: '', |
| component: webapp_components_flow_design_system_fds_demo_js__WEBPACK_IMPORTED_MODULE_1__["default"] |
| }]); |
| /* harmony default export */ __webpack_exports__["default"] = (FdsRoutes); |
| |
| /***/ }), |
| |
| /***/ "./webapp/services/fds.service.js": |
| /*!****************************************!*\ |
| !*** ./webapp/services/fds.service.js ***! |
| \****************************************/ |
| /*! exports provided: default */ |
| /***/ (function(module, __webpack_exports__, __webpack_require__) { |
| |
| "use strict"; |
| __webpack_require__.r(__webpack_exports__); |
| /* harmony import */ var _covalent_core_data_table__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @covalent/core/data-table */ "./node_modules/@covalent/core/fesm5/covalent-core-data-table.js"); |
| /* harmony import */ var _nifi_fds_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @nifi-fds/core */ "./platform/core/index.js"); |
| /* harmony import */ var _package_json__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../package.json */ "./package.json"); |
| var _package_json__WEBPACK_IMPORTED_MODULE_2___namespace = /*#__PURE__*/__webpack_require__.t(/*! ../../package.json */ "./package.json", 1); |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the 'License'); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an 'AS IS' BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| |
| |
| /** |
| * FdsService constructor. |
| * |
| * @param tdDataTableService The covalent data table service module. |
| * @param fdsDialogService The FDS dialog service. |
| * @param fdsSnackBarService The FDS snack bar service module. |
| * @constructor |
| */ |
| |
| function FdsService(tdDataTableService, fdsDialogService, fdsSnackBarService) { |
| // Services |
| this.dialogService = fdsDialogService; |
| this.snackBarService = fdsSnackBarService; |
| this.dataTableService = tdDataTableService; // General |
| |
| this.title = 'Apache NiFi Flow Design System Demo v' + _package_json__WEBPACK_IMPORTED_MODULE_2__["version"]; |
| this.inProgress = true; |
| this.perspective = ''; |
| } |
| |
| FdsService.prototype = { |
| constructor: FdsService |
| }; |
| FdsService.parameters = [_covalent_core_data_table__WEBPACK_IMPORTED_MODULE_0__["TdDataTableService"], _nifi_fds_core__WEBPACK_IMPORTED_MODULE_1__["FdsDialogService"], _nifi_fds_core__WEBPACK_IMPORTED_MODULE_1__["FdsSnackBarService"]]; |
| /* harmony default export */ __webpack_exports__["default"] = (FdsService); |
| |
| /***/ }) |
| |
| /******/ }); |
| //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bhbmd1bGFyL2NvcmUvZmVzbTUgbGF6eSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovLy8uL3BsYXRmb3JtL2NvcmUvY29tbW9uL2Zkcy1jb21tb24ubW9kdWxlLmpzIiwid2VicGFjazovLy8uL3BsYXRmb3JtL2NvcmUvY29tbW9uL2Zkcy5hbmltYXRpb25zLmpzIiwid2VicGFjazovLy8uL3BsYXRmb3JtL2NvcmUvY29tbW9uL3NlcnZpY2VzL2Zkcy1zdG9yYWdlLnNlcnZpY2UuanMiLCJ3ZWJwYWNrOi8vLy4vcGxhdGZvcm0vY29yZS9kaWFsb2dzL2NvbmZpcm0tZGlhbG9nL2NvbmZpcm0tZGlhbG9nLmNvbXBvbmVudC5odG1sIiwid2VicGFjazovLy8uL3BsYXRmb3JtL2NvcmUvZGlhbG9ncy9jb25maXJtLWRpYWxvZy9jb25maXJtLWRpYWxvZy5jb21wb25lbnQuanMiLCJ3ZWJwYWNrOi8vLy4vcGxhdGZvcm0vY29yZS9kaWFsb2dzL2Zkcy1kaWFsb2cuY29tcG9uZW50Lmh0bWwiLCJ3ZWJwYWNrOi8vLy4vcGxhdGZvcm0vY29yZS9kaWFsb2dzL2Zkcy1kaWFsb2cuY29tcG9uZW50LmpzIiwid2VicGFjazovLy8uL3BsYXRmb3JtL2NvcmUvZGlhbG9ncy9mZHMtZGlhbG9ncy5tb2R1bGUuanMiLCJ3ZWJwYWNrOi8vLy4vcGxhdGZvcm0vY29yZS9kaWFsb2dzL3NlcnZpY2VzL2RpYWxvZy5zZXJ2aWNlLmpzIiwid2VicGFjazovLy8uL3BsYXRmb3JtL2NvcmUvZmxvdy1kZXNpZ24tc3lzdGVtLm1vZHVsZS5qcyIsIndlYnBhY2s6Ly8vLi9wbGF0Zm9ybS9jb3JlL2luZGV4LmpzIiwid2VicGFjazovLy8uL3BsYXRmb3JtL2NvcmUvc25hY2tiYXJzL2NvYXN0ZXIvY29hc3Rlci5jb21wb25lbnQuaHRtbCIsIndlYnBhY2s6Ly8vLi9wbGF0Zm9ybS9jb3JlL3NuYWNrYmFycy9jb2FzdGVyL2NvYXN0ZXIuY29tcG9uZW50LmpzIiwid2VicGFjazovLy8uL3BsYXRmb3JtL2NvcmUvc25hY2tiYXJzL2Zkcy1zbmFja2Jhci5jb21wb25lbnQuaHRtbCIsIndlYnBhY2s6Ly8vLi9wbGF0Zm9ybS9jb3JlL3NuYWNrYmFycy9mZHMtc25hY2tiYXIuY29tcG9uZW50LmpzIiwid2VicGFjazovLy8uL3BsYXRmb3JtL2NvcmUvc25hY2tiYXJzL2Zkcy1zbmFja2JhcnMubW9kdWxlLmpzIiwid2VicGFjazovLy8uL3BsYXRmb3JtL2NvcmUvc25hY2tiYXJzL3NlcnZpY2VzL3NuYWNrYmFyLnNlcnZpY2UuanMiLCJ3ZWJwYWNrOi8vLy4vd2ViYXBwL2NvbXBvbmVudHMvZmxvdy1kZXNpZ24tc3lzdGVtL2RpYWxvZ3MvZGVtby9mZHMtZGVtby1kaWFsb2cuaHRtbCIsIndlYnBhY2s6Ly8vLi93ZWJhcHAvY29tcG9uZW50cy9mbG93LWRlc2lnbi1zeXN0ZW0vZGlhbG9ncy9kZW1vL2Zkcy1kZW1vLWRpYWxvZy5qcyIsIndlYnBhY2s6Ly8vLi93ZWJhcHAvY29tcG9uZW50cy9mbG93LWRlc2lnbi1zeXN0ZW0vZmRzLWRlbW8uaHRtbCIsIndlYnBhY2s6Ly8vLi93ZWJhcHAvY29tcG9uZW50cy9mbG93LWRlc2lnbi1zeXN0ZW0vZmRzLWRlbW8uanMiLCJ3ZWJwYWNrOi8vLy4vd2ViYXBwL2Zkcy1ib290c3RyYXAuanMiLCJ3ZWJwYWNrOi8vLy4vd2ViYXBwL2Zkcy5odG1sIiwid2VicGFjazovLy8uL3dlYmFwcC9mZHMuanMiLCJ3ZWJwYWNrOi8vLy4vd2ViYXBwL2Zkcy5tb2R1bGUuanMiLCJ3ZWJwYWNrOi8vLy4vd2ViYXBwL2Zkcy5yb3V0ZXMuanMiLCJ3ZWJwYWNrOi8vLy4vd2ViYXBwL3NlcnZpY2VzL2Zkcy5zZXJ2aWNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdC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QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHLEVBQUU7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjs7QUFFQTtBQUNBO0FBQ0Esa0RBQWtEO0FBQ2xEOztBQUVBO0FBQ0EsZ0VBQWdFO0FBQ2hFOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUcsRUFBRTtBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHLEVBQUU7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLDRHQUFhO0FBQ2xDLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxH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Q2pDLGNBQWMsc0VBQVU7QUFDeEIsY0FBYyxxREFBRztBQUNqQixDQUFDO0FBQ2Msd0VBQVMsRTs7Ozs7Ozs7Ozs7O0FDcEN4QjtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQytDO0FBQ3dCO0FBQ3ZFLGdCQUFnQiw0REFBWTtBQUM1QjtBQUNBLGFBQWEsd0ZBQU87QUFDcEIsQ0FBQztBQUNjLHdFQUFTLEU7Ozs7Ozs7Ozs7OztBQ3RCeEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDK0Q7QUFDTztBQUN6QjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDOztBQUU3Qyx5REFBeUQscURBQU87QUFDaEU7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5Qiw0RUFBa0IsRUFBRSwrREFBZ0IsRUFBRSxpRUFBa0I7QUFDbEUseUVBQVUsRSIsImZpbGUiOiJmZHMtZGVtby5idW5kbGUubWluLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gaW5zdGFsbCBhIEpTT05QIGNhbGxiYWNrIGZvciBjaHVuayBsb2FkaW5nXG4gXHRmdW5jdGlvbiB3ZWJwYWNrSnNvbnBDYWxsYmFjayhkYXRhKSB7XG4gXHRcdHZhciBjaHVua0lkcyA9IGRhdGFbMF07XG4gXHRcdHZhciBtb3JlTW9kdWxlcyA9IGRhdGFbMV07XG4gXHRcdHZhciBleGVjdXRlTW9kdWxlcyA9IGRhdGFbMl07XG5cbiBcdFx0Ly8gYWRkIFwibW9yZU1vZHVsZXNcIiB0byB0aGUgbW9kdWxlcyBvYmplY3QsXG4gXHRcdC8vIHRoZW4gZmxhZyBhbGwgXCJjaHVua0lkc1wiIGFzIGxvYWRlZCBhbmQgZmlyZSBjYWxsYmFja1xuIFx0XHR2YXIgbW9kdWxlSWQsIGNodW5rSWQsIGkgPSAwLCByZXNvbHZlcyA9IFtdO1xuIFx0XHRmb3IoO2kgPCBjaHVua0lkcy5sZW5ndGg7IGkrKykge1xuIFx0XHRcdGNodW5rSWQgPSBjaHVua0lkc1tpXTtcbiBcdFx0XHRpZihpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0pIHtcbiBcdFx0XHRcdHJlc29sdmVzLnB1c2goaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdWzBdKTtcbiBcdFx0XHR9XG4gXHRcdFx0aW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdID0gMDtcbiBcdFx0fVxuIFx0XHRmb3IobW9kdWxlSWQgaW4gbW9yZU1vZHVsZXMpIHtcbiBcdFx0XHRpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9yZU1vZHVsZXMsIG1vZHVsZUlkKSkge1xuIFx0XHRcdFx0bW9kdWxlc1ttb2R1bGVJZF0gPSBtb3JlTW9kdWxlc1ttb2R1bGVJZF07XG4gXHRcdFx0fVxuIFx0XHR9XG4gXHRcdGlmKHBhcmVudEpzb25wRnVuY3Rpb24pIHBhcmVudEpzb25wRnVuY3Rpb24oZGF0YSk7XG5cbiBcdFx0d2hpbGUocmVzb2x2ZXMubGVuZ3RoKSB7XG4gXHRcdFx0cmVzb2x2ZXMuc2hpZnQoKSgpO1xuIFx0XHR9XG5cbiBcdFx0Ly8gYWRkIGVudHJ5IG1vZHVsZXMgZnJvbSBsb2FkZWQgY2h1bmsgdG8gZGVmZXJyZWQgbGlzdFxuIFx0XHRkZWZlcnJlZE1vZHVsZXMucHVzaC5hcHBseShkZWZlcnJlZE1vZHVsZXMsIGV4ZWN1dGVNb2R1bGVzIHx8IFtdKTtcblxuIFx0XHQvLyBydW4gZGVmZXJyZWQgbW9kdWxlcyB3aGVuIGFsbCBjaHVua3MgcmVhZHlcbiBcdFx0cmV0dXJuIGNoZWNrRGVmZXJyZWRNb2R1bGVzKCk7XG4gXHR9O1xuIFx0ZnVuY3Rpb24gY2hlY2tEZWZlcnJlZE1vZHVsZXMoKSB7XG4gXHRcdHZhciByZXN1bHQ7XG4gXHRcdGZvcih2YXIgaSA9IDA7IGkgPCBkZWZlcnJlZE1vZHVsZXMubGVuZ3RoOyBpKyspIHtcbiBcdFx0XHR2YXIgZGVmZXJyZWRNb2R1bGUgPSBkZWZlcnJlZE1vZHVsZXNbaV07XG4gXHRcdFx0dmFyIGZ1bGZpbGxlZCA9IHRydWU7XG4gXHRcdFx0Zm9yKHZhciBqID0gMTsgaiA8IGRlZmVycmVkTW9kdWxlLmxlbmd0aDsgaisrKSB7XG4gXHRcdFx0XHR2YXIgZGVwSWQgPSBkZWZlcnJlZE1vZHVsZVtqXTtcbiBcdFx0XHRcdGlmKGluc3RhbGxlZENodW5rc1tkZXBJZF0gIT09IDApIGZ1bGZpbGxlZCA9IGZhbHNlO1xuIFx0XHRcdH1cbiBcdFx0XHRpZihmdWxmaWxsZWQpIHtcbiBcdFx0XHRcdGRlZmVycmVkTW9kdWxlcy5zcGxpY2UoaS0tLCAxKTtcbiBcdFx0XHRcdHJlc3VsdCA9IF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gZGVmZXJyZWRNb2R1bGVbMF0pO1xuIFx0XHRcdH1cbiBcdFx0fVxuXG4gXHRcdHJldHVybiByZXN1bHQ7XG4gXHR9XG4gXHRmdW5jdGlvbiBob3REaXNwb3NlQ2h1bmsoY2h1bmtJZCkge1xuIFx0XHRkZWxldGUgaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdO1xuIFx0fVxuIFx0dmFyIHBhcmVudEhvdFVwZGF0ZUNhbGxiYWNrID0gd2luZG93W1wid2VicGFja0hvdFVwZGF0ZVwiXTtcbiBcdHdpbmRvd1tcIndlYnBhY2tIb3RVcGRhdGVcIl0gPSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiBcdGZ1bmN0aW9uIHdlYnBhY2tIb3RVcGRhdGVDYWxsYmFjayhjaHVua0lkLCBtb3JlTW9kdWxlcykge1xuIFx0XHRob3RBZGRVcGRhdGVDaHVuayhjaHVua0lkLCBtb3JlTW9kdWxlcyk7XG4gXHRcdGlmIChwYXJlbnRIb3RVcGRhdGVDYWxsYmFjaykgcGFyZW50SG90VXBkYXRlQ2FsbGJhY2soY2h1bmtJZCwgbW9yZU1vZHVsZXMpO1xuIFx0fSA7XG5cbiBcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuIFx0ZnVuY3Rpb24gaG90RG93bmxvYWRVcGRhdGVDaHVuayhjaHVua0lkKSB7XG4gXHRcdHZhciBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO1xuIFx0XHRzY3JpcHQuY2hhcnNldCA9IFwidXRmLThcIjtcbiBcdFx0c2NyaXB0LnNyYyA9IF9fd2VicGFja19yZXF1aXJlX18ucCArIFwiXCIgKyBjaHVua0lkICsgXCIuXCIgKyBob3RDdXJyZW50SGFzaCArIFwiLmhvdC11cGRhdGUuanNcIjtcbiBcdFx0aWYgKG51bGwpIHNjcmlwdC5jcm9zc09yaWdpbiA9IG51bGw7XG4gXHRcdGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbiBcdH1cblxuIFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gXHRmdW5jdGlvbiBob3REb3dubG9hZE1hbmlmZXN0KHJlcXVlc3RUaW1lb3V0KSB7XG4gXHRcdHJlcXVlc3RUaW1lb3V0ID0gcmVxdWVzdFRpbWVvdXQgfHwgMTAwMDA7XG4gXHRcdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiBcdFx0XHRpZiAodHlwZW9mIFhNTEh0dHBSZXF1ZXN0ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gXHRcdFx0XHRyZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihcIk5vIGJyb3dzZXIgc3VwcG9ydFwiKSk7XG4gXHRcdFx0fVxuIFx0XHRcdHRyeSB7XG4gXHRcdFx0XHR2YXIgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuIFx0XHRcdFx0dmFyIHJlcXVlc3RQYXRoID0gX193ZWJwYWNrX3JlcXVpcmVfXy5wICsgXCJcIiArIGhvdEN1cnJlbnRIYXNoICsgXCIuaG90LXVwZGF0ZS5qc29uXCI7XG4gXHRcdFx0XHRyZXF1ZXN0Lm9wZW4oXCJHRVRcIiwgcmVxdWVzdFBhdGgsIHRydWUpO1xuIFx0XHRcdFx0cmVxdWVzdC50aW1lb3V0ID0gcmVxdWVzdFRpbWVvdXQ7XG4gXHRcdFx0XHRyZXF1ZXN0LnNlbmQobnVsbCk7XG4gXHRcdFx0fSBjYXRjaCAoZXJyKSB7XG4gXHRcdFx0XHRyZXR1cm4gcmVqZWN0KGVycik7XG4gXHRcdFx0fVxuIFx0XHRcdHJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7XG4gXHRcdFx0XHRpZiAocmVxdWVzdC5yZWFkeVN0YXRlICE9PSA0KSByZXR1cm47XG4gXHRcdFx0XHRpZiAocmVxdWVzdC5zdGF0dXMgPT09IDApIHtcbiBcdFx0XHRcdFx0Ly8gdGltZW91dFxuIFx0XHRcdFx0XHRyZWplY3QoXG4gXHRcdFx0XHRcdFx0bmV3IEVycm9yKFwiTWFuaWZlc3QgcmVxdWVzdCB0byBcIiArIHJlcXVlc3RQYXRoICsgXCIgdGltZWQgb3V0LlwiKVxuIFx0XHRcdFx0XHQpO1xuIFx0XHRcdFx0fSBlbHNlIGlmIChyZXF1ZXN0LnN0YXR1cyA9PT0gNDA0KSB7XG4gXHRcdFx0XHRcdC8vIG5vIHVwZGF0ZSBhdmFpbGFibGVcbiBcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuIFx0XHRcdFx0fSBlbHNlIGlmIChyZXF1ZXN0LnN0YXR1cyAhPT0gMjAwICYmIHJlcXVlc3Quc3RhdHVzICE9PSAzMDQpIHtcbiBcdFx0XHRcdFx0Ly8gb3RoZXIgZmFpbHVyZVxuIFx0XHRcdFx0XHRyZWplY3QobmV3IEVycm9yKFwiTWFuaWZlc3QgcmVxdWVzdCB0byBcIiArIHJlcXVlc3RQYXRoICsgXCIgZmFpbGVkLlwiKSk7XG4gXHRcdFx0XHR9IGVsc2Uge1xuIFx0XHRcdFx0XHQvLyBzdWNjZXNzXG4gXHRcdFx0XHRcdHRyeSB7XG4gXHRcdFx0XHRcdFx0dmFyIHVwZGF0ZSA9IEpTT04ucGFyc2UocmVxdWVzdC5yZXNwb25zZVRleHQpO1xuIFx0XHRcdFx0XHR9IGNhdGNoIChlKSB7XG4gXHRcdFx0XHRcdFx0cmVqZWN0KGUpO1xuIFx0XHRcdFx0XHRcdHJldHVybjtcbiBcdFx0XHRcdFx0fVxuIFx0XHRcdFx0XHRyZXNvbHZlKHVwZGF0ZSk7XG4gXHRcdFx0XHR9XG4gXHRcdFx0fTtcbiBcdFx0fSk7XG4gXHR9XG5cbiBcdHZhciBob3RBcHBseU9uVXBkYXRlID0gdHJ1ZTtcbiBcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuIFx0dmFyIGhvdEN1cnJlbnRIYXNoID0gXCI0ZmYwMWEwZTMyN2VkZGVmMjVmOVwiO1xuIFx0dmFyIGhvdFJlcXVlc3RUaW1lb3V0ID0gMTAwMDA7XG4gXHR2YXIgaG90Q3VycmVudE1vZHVsZURhdGEgPSB7fTtcbiBcdHZhciBob3RDdXJyZW50Q2hpbGRNb2R1bGU7XG4gXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiBcdHZhciBob3RDdXJyZW50UGFyZW50cyA9IFtdO1xuIFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gXHR2YXIgaG90Q3VycmVudFBhcmVudHNUZW1wID0gW107XG5cbiBcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuIFx0ZnVuY3Rpb24gaG90Q3JlYXRlUmVxdWlyZShtb2R1bGVJZCkge1xuIFx0XHR2YXIgbWUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXTtcbiBcdFx0aWYgKCFtZSkgcmV0dXJuIF9fd2VicGFja19yZXF1aXJlX187XG4gXHRcdHZhciBmbiA9IGZ1bmN0aW9uKHJlcXVlc3QpIHtcbiBcdFx0XHRpZiAobWUuaG90LmFjdGl2ZSkge1xuIFx0XHRcdFx0aWYgKGluc3RhbGxlZE1vZHVsZXNbcmVxdWVzdF0pIHtcbiBcdFx0XHRcdFx0aWYgKGluc3RhbGxlZE1vZHVsZXNbcmVxdWVzdF0ucGFyZW50cy5pbmRleE9mKG1vZHVsZUlkKSA9PT0gLTEpIHtcbiBcdFx0XHRcdFx0XHRpbnN0YWxsZWRNb2R1bGVzW3JlcXVlc3RdLnBhcmVudHMucHVzaChtb2R1bGVJZCk7XG4gXHRcdFx0XHRcdH1cbiBcdFx0XHRcdH0gZWxzZSB7XG4gXHRcdFx0XHRcdGhvdEN1cnJlbnRQYXJlbnRzID0gW21vZHVsZUlkXTtcbiBcdFx0XHRcdFx0aG90Q3VycmVudENoaWxkTW9kdWxlID0gcmVxdWVzdDtcbiBcdFx0XHRcdH1cbiBcdFx0XHRcdGlmIChtZS5jaGlsZHJlbi5pbmRleE9mKHJlcXVlc3QpID09PSAtMSkge1xuIFx0XHRcdFx0XHRtZS5jaGlsZHJlbi5wdXNoKHJlcXVlc3QpO1xuIFx0XHRcdFx0fVxuIFx0XHRcdH0gZWxzZSB7XG4gXHRcdFx0XHRjb25zb2xlLndhcm4oXG4gXHRcdFx0XHRcdFwiW0hNUl0gdW5leHBlY3RlZCByZXF1aXJlKFwiICtcbiBcdFx0XHRcdFx0XHRyZXF1ZXN0ICtcbiBcdFx0XHRcdFx0XHRcIikgZnJvbSBkaXNwb3NlZCBtb2R1bGUgXCIgK1xuIFx0XHRcdFx0XHRcdG1vZHVsZUlkXG4gXHRcdFx0XHQpO1xuIFx0XHRcdFx0aG90Q3VycmVudFBhcmVudHMgPSBbXTtcbiBcdFx0XHR9XG4gXHRcdFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18ocmVxdWVzdCk7XG4gXHRcdH07XG4gXHRcdHZhciBPYmplY3RGYWN0b3J5ID0gZnVuY3Rpb24gT2JqZWN0RmFjdG9yeShuYW1lKSB7XG4gXHRcdFx0cmV0dXJuIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xuIFx0XHRcdFx0XHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfX1tuYW1lXTtcbiBcdFx0XHRcdH0sXG4gXHRcdFx0XHRzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gXHRcdFx0XHRcdF9fd2VicGFja19yZXF1aXJlX19bbmFtZV0gPSB2YWx1ZTtcbiBcdFx0XHRcdH1cbiBcdFx0XHR9O1xuIFx0XHR9O1xuIFx0XHRmb3IgKHZhciBuYW1lIGluIF9fd2VicGFja19yZXF1aXJlX18pIHtcbiBcdFx0XHRpZiAoXG4gXHRcdFx0XHRPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoX193ZWJwYWNrX3JlcXVpcmVfXywgbmFtZSkgJiZcbiBcdFx0XHRcdG5hbWUgIT09IFwiZVwiICYmXG4gXHRcdFx0XHRuYW1lICE9PSBcInRcIlxuIFx0XHRcdCkge1xuIFx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGZuLCBuYW1lLCBPYmplY3RGYWN0b3J5KG5hbWUpKTtcbiBcdFx0XHR9XG4gXHRcdH1cbiBcdFx0Zm4uZSA9IGZ1bmN0aW9uKGNodW5rSWQpIHtcbiBcdFx0XHRpZiAoaG90U3RhdHVzID09PSBcInJlYWR5XCIpIGhvdFNldFN0YXR1cyhcInByZXBhcmVcIik7XG4gXHRcdFx0aG90Q2h1bmtzTG9hZGluZysrO1xuIFx0XHRcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fLmUoY2h1bmtJZCkudGhlbihmaW5pc2hDaHVua0xvYWRpbmcsIGZ1bmN0aW9uKGVycikge1xuIFx0XHRcdFx0ZmluaXNoQ2h1bmtMb2FkaW5nKCk7XG4gXHRcdFx0XHR0aHJvdyBlcnI7XG4gXHRcdFx0fSk7XG5cbiBcdFx0XHRmdW5jdGlvbiBmaW5pc2hDaHVua0xvYWRpbmcoKSB7XG4gXHRcdFx0XHRob3RDaHVua3NMb2FkaW5nLS07XG4gXHRcdFx0XHRpZiAoaG90U3RhdHVzID09PSBcInByZXBhcmVcIikge1xuIFx0XHRcdFx0XHRpZiAoIWhvdFdhaXRpbmdGaWxlc01hcFtjaHVua0lkXSkge1xuIFx0XHRcdFx0XHRcdGhvdEVuc3VyZVVwZGF0ZUNodW5rKGNodW5rSWQpO1xuIFx0XHRcdFx0XHR9XG4gXHRcdFx0XHRcdGlmIChob3RDaHVua3NMb2FkaW5nID09PSAwICYmIGhvdFdhaXRpbmdGaWxlcyA9PT0gMCkge1xuIFx0XHRcdFx0XHRcdGhvdFVwZGF0ZURvd25sb2FkZWQoKTtcbiBcdFx0XHRcdFx0fVxuIFx0XHRcdFx0fVxuIFx0XHRcdH1cbiBcdFx0fTtcbiBcdFx0Zm4udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdFx0aWYgKG1vZGUgJiAxKSB2YWx1ZSA9IGZuKHZhbHVlKTtcbiBcdFx0XHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXy50KHZhbHVlLCBtb2RlICYgfjEpO1xuIFx0XHR9O1xuIFx0XHRyZXR1cm4gZm47XG4gXHR9XG5cbiBcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuIFx0ZnVuY3Rpb24gaG90Q3JlYXRlTW9kdWxlKG1vZHVsZUlkKSB7XG4gXHRcdHZhciBob3QgPSB7XG4gXHRcdFx0Ly8gcHJpdmF0ZSBzdHVmZlxuIFx0XHRcdF9hY2NlcHRlZERlcGVuZGVuY2llczoge30sXG4gXHRcdFx0X2RlY2xpbmVkRGVwZW5kZW5jaWVzOiB7fSxcbiBcdFx0XHRfc2VsZkFjY2VwdGVkOiBmYWxzZSxcbiBcdFx0XHRfc2VsZkRlY2xpbmVkOiBmYWxzZSxcbiBcdFx0XHRfZGlzcG9zZUhhbmRsZXJzOiBbXSxcbiBcdFx0XHRfbWFpbjogaG90Q3VycmVudENoaWxkTW9kdWxlICE9PSBtb2R1bGVJZCxcblxuIFx0XHRcdC8vIE1vZHVsZSBBUElcbiBcdFx0XHRhY3RpdmU6IHRydWUsXG4gXHRcdFx0YWNjZXB0OiBmdW5jdGlvbihkZXAsIGNhbGxiYWNrKSB7XG4gXHRcdFx0XHRpZiAoZGVwID09PSB1bmRlZmluZWQpIGhvdC5fc2VsZkFjY2VwdGVkID0gdHJ1ZTtcbiBcdFx0XHRcdGVsc2UgaWYgKHR5cGVvZiBkZXAgPT09IFwiZnVuY3Rpb25cIikgaG90Ll9zZWxmQWNjZXB0ZWQgPSBkZXA7XG4gXHRcdFx0XHRlbHNlIGlmICh0eXBlb2YgZGVwID09PSBcIm9iamVjdFwiKVxuIFx0XHRcdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGRlcC5sZW5ndGg7IGkrKylcbiBcdFx0XHRcdFx0XHRob3QuX2FjY2VwdGVkRGVwZW5kZW5jaWVzW2RlcFtpXV0gPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuIFx0XHRcdFx0ZWxzZSBob3QuX2FjY2VwdGVkRGVwZW5kZW5jaWVzW2RlcF0gPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuIFx0XHRcdH0sXG4gXHRcdFx0ZGVjbGluZTogZnVuY3Rpb24oZGVwKSB7XG4gXHRcdFx0XHRpZiAoZGVwID09PSB1bmRlZmluZWQpIGhvdC5fc2VsZkRlY2xpbmVkID0gdHJ1ZTtcbiBcdFx0XHRcdGVsc2UgaWYgKHR5cGVvZiBkZXAgPT09IFwib2JqZWN0XCIpXG4gXHRcdFx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgZGVwLmxlbmd0aDsgaSsrKVxuIFx0XHRcdFx0XHRcdGhvdC5fZGVjbGluZWREZXBlbmRlbmNpZXNbZGVwW2ldXSA9IHRydWU7XG4gXHRcdFx0XHRlbHNlIGhvdC5fZGVjbGluZWREZXBlbmRlbmNpZXNbZGVwXSA9IHRydWU7XG4gXHRcdFx0fSxcbiBcdFx0XHRkaXNwb3NlOiBmdW5jdGlvbihjYWxsYmFjaykge1xuIFx0XHRcdFx0aG90Ll9kaXNwb3NlSGFuZGxlcnMucHVzaChjYWxsYmFjayk7XG4gXHRcdFx0fSxcbiBcdFx0XHRhZGREaXNwb3NlSGFuZGxlcjogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiBcdFx0XHRcdGhvdC5fZGlzcG9zZUhhbmRsZXJzLnB1c2goY2FsbGJhY2spO1xuIFx0XHRcdH0sXG4gXHRcdFx0cmVtb3ZlRGlzcG9zZUhhbmRsZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gXHRcdFx0XHR2YXIgaWR4ID0gaG90Ll9kaXNwb3NlSGFuZGxlcnMuaW5kZXhPZihjYWxsYmFjayk7XG4gXHRcdFx0XHRpZiAoaWR4ID49IDApIGhvdC5fZGlzcG9zZUhhbmRsZXJzLnNwbGljZShpZHgsIDEpO1xuIFx0XHRcdH0sXG5cbiBcdFx0XHQvLyBNYW5hZ2VtZW50IEFQSVxuIFx0XHRcdGNoZWNrOiBob3RDaGVjayxcbiBcdFx0XHRhcHBseTogaG90QXBwbHksXG4gXHRcdFx0c3RhdHVzOiBmdW5jdGlvbihsKSB7XG4gXHRcdFx0XHRpZiAoIWwpIHJldHVybiBob3RTdGF0dXM7XG4gXHRcdFx0XHRob3RTdGF0dXNIYW5kbGVycy5wdXNoKGwpO1xuIFx0XHRcdH0sXG4gXHRcdFx0YWRkU3RhdHVzSGFuZGxlcjogZnVuY3Rpb24obCkge1xuIFx0XHRcdFx0aG90U3RhdHVzSGFuZGxlcnMucHVzaChsKTtcbiBcdFx0XHR9LFxuIFx0XHRcdHJlbW92ZVN0YXR1c0hhbmRsZXI6IGZ1bmN0aW9uKGwpIHtcbiBcdFx0XHRcdHZhciBpZHggPSBob3RTdGF0dXNIYW5kbGVycy5pbmRleE9mKGwpO1xuIFx0XHRcdFx0aWYgKGlkeCA+PSAwKSBob3RTdGF0dXNIYW5kbGVycy5zcGxpY2UoaWR4LCAxKTtcbiBcdFx0XHR9LFxuXG4gXHRcdFx0Ly9pbmhlcml0IGZyb20gcHJldmlvdXMgZGlzcG9zZSBjYWxsXG4gXHRcdFx0ZGF0YTogaG90Q3VycmVudE1vZHVsZURhdGFbbW9kdWxlSWRdXG4gXHRcdH07XG4gXHRcdGhvdEN1cnJlbnRDaGlsZE1vZHVsZSA9IHVuZGVmaW5lZDtcbiBcdFx0cmV0dXJuIGhvdDtcbiBcdH1cblxuIFx0dmFyIGhvdFN0YXR1c0hhbmRsZXJzID0gW107XG4gXHR2YXIgaG90U3RhdHVzID0gXCJpZGxlXCI7XG5cbiBcdGZ1bmN0aW9uIGhvdFNldFN0YXR1cyhuZXdTdGF0dXMpIHtcbiBcdFx0aG90U3RhdHVzID0gbmV3U3RhdHVzO1xuIFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGhvdFN0YXR1c0hhbmRsZXJzLmxlbmd0aDsgaSsrKVxuIFx0XHRcdGhvdFN0YXR1c0hhbmRsZXJzW2ldLmNhbGwobnVsbCwgbmV3U3RhdHVzKTtcbiBcdH1cblxuIFx0Ly8gd2hpbGUgZG93bmxvYWRpbmdcbiBcdHZhciBob3RXYWl0aW5nRmlsZXMgPSAwO1xuIFx0dmFyIGhvdENodW5rc0xvYWRpbmcgPSAwO1xuIFx0dmFyIGhvdFdhaXRpbmdGaWxlc01hcCA9IHt9O1xuIFx0dmFyIGhvdFJlcXVlc3RlZEZpbGVzTWFwID0ge307XG4gXHR2YXIgaG90QXZhaWxhYmxlRmlsZXNNYXAgPSB7fTtcbiBcdHZhciBob3REZWZlcnJlZDtcblxuIFx0Ly8gVGhlIHVwZGF0ZSBpbmZvXG4gXHR2YXIgaG90VXBkYXRlLCBob3RVcGRhdGVOZXdIYXNoO1xuXG4gXHRmdW5jdGlvbiB0b01vZHVsZUlkKGlkKSB7XG4gXHRcdHZhciBpc051bWJlciA9ICtpZCArIFwiXCIgPT09IGlkO1xuIFx0XHRyZXR1cm4gaXNOdW1iZXIgPyAraWQgOiBpZDtcbiBcdH1cblxuIFx0ZnVuY3Rpb24gaG90Q2hlY2soYXBwbHkpIHtcbiBcdFx0aWYgKGhvdFN0YXR1cyAhPT0gXCJpZGxlXCIpIHtcbiBcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJjaGVjaygpIGlzIG9ubHkgYWxsb3dlZCBpbiBpZGxlIHN0YXR1c1wiKTtcbiBcdFx0fVxuIFx0XHRob3RBcHBseU9uVXBkYXRlID0gYXBwbHk7XG4gXHRcdGhvdFNldFN0YXR1cyhcImNoZWNrXCIpO1xuIFx0XHRyZXR1cm4gaG90RG93bmxvYWRNYW5pZmVzdChob3RSZXF1ZXN0VGltZW91dCkudGhlbihmdW5jdGlvbih1cGRhdGUpIHtcbiBcdFx0XHRpZiAoIXVwZGF0ZSkge1xuIFx0XHRcdFx0aG90U2V0U3RhdHVzKFwiaWRsZVwiKTtcbiBcdFx0XHRcdHJldHVybiBudWxsO1xuIFx0XHRcdH1cbiBcdFx0XHRob3RSZXF1ZXN0ZWRGaWxlc01hcCA9IHt9O1xuIFx0XHRcdGhvdFdhaXRpbmdGaWxlc01hcCA9IHt9O1xuIFx0XHRcdGhvdEF2YWlsYWJsZUZpbGVzTWFwID0gdXBkYXRlLmM7XG4gXHRcdFx0aG90VXBkYXRlTmV3SGFzaCA9IHVwZGF0ZS5oO1xuXG4gXHRcdFx0aG90U2V0U3RhdHVzKFwicHJlcGFyZVwiKTtcbiBcdFx0XHR2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuIFx0XHRcdFx0aG90RGVmZXJyZWQgPSB7XG4gXHRcdFx0XHRcdHJlc29sdmU6IHJlc29sdmUsXG4gXHRcdFx0XHRcdHJlamVjdDogcmVqZWN0XG4gXHRcdFx0XHR9O1xuIFx0XHRcdH0pO1xuIFx0XHRcdGhvdFVwZGF0ZSA9IHt9O1xuIFx0XHRcdGZvcih2YXIgY2h1bmtJZCBpbiBpbnN0YWxsZWRDaHVua3MpXG4gXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWxvbmUtYmxvY2tzXG4gXHRcdFx0e1xuIFx0XHRcdFx0LypnbG9iYWxzIGNodW5rSWQgKi9cbiBcdFx0XHRcdGhvdEVuc3VyZVVwZGF0ZUNodW5rKGNodW5rSWQpO1xuIFx0XHRcdH1cbiBcdFx0XHRpZiAoXG4gXHRcdFx0XHRob3RTdGF0dXMgPT09IFwicHJlcGFyZVwiICYmXG4gXHRcdFx0XHRob3RDaHVua3NMb2FkaW5nID09PSAwICYmXG4gXHRcdFx0XHRob3RXYWl0aW5nRmlsZXMgPT09IDBcbiBcdFx0XHQpIHtcbiBcdFx0XHRcdGhvdFVwZGF0ZURvd25sb2FkZWQoKTtcbiBcdFx0XHR9XG4gXHRcdFx0cmV0dXJuIHByb21pc2U7XG4gXHRcdH0pO1xuIFx0fVxuXG4gXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiBcdGZ1bmN0aW9uIGhvdEFkZFVwZGF0ZUNodW5rKGNodW5rSWQsIG1vcmVNb2R1bGVzKSB7XG4gXHRcdGlmICghaG90QXZhaWxhYmxlRmlsZXNNYXBbY2h1bmtJZF0gfHwgIWhvdFJlcXVlc3RlZEZpbGVzTWFwW2NodW5rSWRdKVxuIFx0XHRcdHJldHVybjtcbiBcdFx0aG90UmVxdWVzdGVkRmlsZXNNYXBbY2h1bmtJZF0gPSBmYWxzZTtcbiBcdFx0Zm9yICh2YXIgbW9kdWxlSWQgaW4gbW9yZU1vZHVsZXMpIHtcbiBcdFx0XHRpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vcmVNb2R1bGVzLCBtb2R1bGVJZCkpIHtcbiBcdFx0XHRcdGhvdFVwZGF0ZVttb2R1bGVJZF0gPSBtb3JlTW9kdWxlc1ttb2R1bGVJZF07XG4gXHRcdFx0fVxuIFx0XHR9XG4gXHRcdGlmICgtLWhvdFdhaXRpbmdGaWxlcyA9PT0gMCAmJiBob3RDaHVua3NMb2FkaW5nID09PSAwKSB7XG4gXHRcdFx0aG90VXBkYXRlRG93bmxvYWRlZCgpO1xuIFx0XHR9XG4gXHR9XG5cbiBcdGZ1bmN0aW9uIGhvdEVuc3VyZVVwZGF0ZUNodW5rKGNodW5rSWQpIHtcbiBcdFx0aWYgKCFob3RBdmFpbGFibGVGaWxlc01hcFtjaHVua0lkXSkge1xuIFx0XHRcdGhvdFdhaXRpbmdGaWxlc01hcFtjaHVua0lkXSA9IHRydWU7XG4gXHRcdH0gZWxzZSB7XG4gXHRcdFx0aG90UmVxdWVzdGVkRmlsZXNNYXBbY2h1bmtJZF0gPSB0cnVlO1xuIFx0XHRcdGhvdFdhaXRpbmdGaWxlcysrO1xuIFx0XHRcdGhvdERvd25sb2FkVXBkYXRlQ2h1bmsoY2h1bmtJZCk7XG4gXHRcdH1cbiBcdH1cblxuIFx0ZnVuY3Rpb24gaG90VXBkYXRlRG93bmxvYWRlZCgpIHtcbiBcdFx0aG90U2V0U3RhdHVzKFwicmVhZHlcIik7XG4gXHRcdHZhciBkZWZlcnJlZCA9IGhvdERlZmVycmVkO1xuIFx0XHRob3REZWZlcnJlZCA9IG51bGw7XG4gXHRcdGlmICghZGVmZXJyZWQpIHJldHVybjtcbiBcdFx0aWYgKGhvdEFwcGx5T25VcGRhdGUpIHtcbiBcdFx0XHQvLyBXcmFwIGRlZmVycmVkIG9iamVjdCBpbiBQcm9taXNlIHRvIG1hcmsgaXQgYXMgYSB3ZWxsLWhhbmRsZWQgUHJvbWlzZSB0b1xuIFx0XHRcdC8vIGF2b2lkIHRyaWdnZXJpbmcgdW5jYXVnaHQgZXhjZXB0aW9uIHdhcm5pbmcgaW4gQ2hyb21lLlxuIFx0XHRcdC8vIFNlZSBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD00NjU2NjZcbiBcdFx0XHRQcm9taXNlLnJlc29sdmUoKVxuIFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24oKSB7XG4gXHRcdFx0XHRcdHJldHVybiBob3RBcHBseShob3RBcHBseU9uVXBkYXRlKTtcbiBcdFx0XHRcdH0pXG4gXHRcdFx0XHQudGhlbihcbiBcdFx0XHRcdFx0ZnVuY3Rpb24ocmVzdWx0KSB7XG4gXHRcdFx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZShyZXN1bHQpO1xuIFx0XHRcdFx0XHR9LFxuIFx0XHRcdFx0XHRmdW5jdGlvbihlcnIpIHtcbiBcdFx0XHRcdFx0XHRkZWZlcnJlZC5yZWplY3QoZXJyKTtcbiBcdFx0XHRcdFx0fVxuIFx0XHRcdFx0KTtcbiBcdFx0fSBlbHNlIHtcbiBcdFx0XHR2YXIgb3V0ZGF0ZWRNb2R1bGVzID0gW107XG4gXHRcdFx0Zm9yICh2YXIgaWQgaW4gaG90VXBkYXRlKSB7XG4gXHRcdFx0XHRpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGhvdFVwZGF0ZSwgaWQpKSB7XG4gXHRcdFx0XHRcdG91dGRhdGVkTW9kdWxlcy5wdXNoKHRvTW9kdWxlSWQoaWQpKTtcbiBcdFx0XHRcdH1cbiBcdFx0XHR9XG4gXHRcdFx0ZGVmZXJyZWQucmVzb2x2ZShvdXRkYXRlZE1vZHVsZXMpO1xuIFx0XHR9XG4gXHR9XG5cbiBcdGZ1bmN0aW9uIGhvdEFwcGx5KG9wdGlvbnMpIHtcbiBcdFx0aWYgKGhvdFN0YXR1cyAhPT0gXCJyZWFkeVwiKVxuIFx0XHRcdHRocm93IG5ldyBFcnJvcihcImFwcGx5KCkgaXMgb25seSBhbGxvd2VkIGluIHJlYWR5IHN0YXR1c1wiKTtcbiBcdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiBcdFx0dmFyIGNiO1xuIFx0XHR2YXIgaTtcbiBcdFx0dmFyIGo7XG4gXHRcdHZhciBtb2R1bGU7XG4gXHRcdHZhciBtb2R1bGVJZDtcblxuIFx0XHRmdW5jdGlvbiBnZXRBZmZlY3RlZFN0dWZmKHVwZGF0ZU1vZHVsZUlkKSB7XG4gXHRcdFx0dmFyIG91dGRhdGVkTW9kdWxlcyA9IFt1cGRhdGVNb2R1bGVJZF07XG4gXHRcdFx0dmFyIG91dGRhdGVkRGVwZW5kZW5jaWVzID0ge307XG5cbiBcdFx0XHR2YXIgcXVldWUgPSBvdXRkYXRlZE1vZHVsZXMubWFwKGZ1bmN0aW9uKGlkKSB7XG4gXHRcdFx0XHRyZXR1cm4ge1xuIFx0XHRcdFx0XHRjaGFpbjogW2lkXSxcbiBcdFx0XHRcdFx0aWQ6IGlkXG4gXHRcdFx0XHR9O1xuIFx0XHRcdH0pO1xuIFx0XHRcdHdoaWxlIChxdWV1ZS5sZW5ndGggPiAwKSB7XG4gXHRcdFx0XHR2YXIgcXVldWVJdGVtID0gcXVldWUucG9wKCk7XG4gXHRcdFx0XHR2YXIgbW9kdWxlSWQgPSBxdWV1ZUl0ZW0uaWQ7XG4gXHRcdFx0XHR2YXIgY2hhaW4gPSBxdWV1ZUl0ZW0uY2hhaW47XG4gXHRcdFx0XHRtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXTtcbiBcdFx0XHRcdGlmICghbW9kdWxlIHx8IG1vZHVsZS5ob3QuX3NlbGZBY2NlcHRlZCkgY29udGludWU7XG4gXHRcdFx0XHRpZiAobW9kdWxlLmhvdC5fc2VsZkRlY2xpbmVkKSB7XG4gXHRcdFx0XHRcdHJldHVybiB7XG4gXHRcdFx0XHRcdFx0dHlwZTogXCJzZWxmLWRlY2xpbmVkXCIsXG4gXHRcdFx0XHRcdFx0Y2hhaW46IGNoYWluLFxuIFx0XHRcdFx0XHRcdG1vZHVsZUlkOiBtb2R1bGVJZFxuIFx0XHRcdFx0XHR9O1xuIFx0XHRcdFx0fVxuIFx0XHRcdFx0aWYgKG1vZHVsZS5ob3QuX21haW4pIHtcbiBcdFx0XHRcdFx0cmV0dXJuIHtcbiBcdFx0XHRcdFx0XHR0eXBlOiBcInVuYWNjZXB0ZWRcIixcbiBcdFx0XHRcdFx0XHRjaGFpbjogY2hhaW4sXG4gXHRcdFx0XHRcdFx0bW9kdWxlSWQ6IG1vZHVsZUlkXG4gXHRcdFx0XHRcdH07XG4gXHRcdFx0XHR9XG4gXHRcdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IG1vZHVsZS5wYXJlbnRzLmxlbmd0aDsgaSsrKSB7XG4gXHRcdFx0XHRcdHZhciBwYXJlbnRJZCA9IG1vZHVsZS5wYXJlbnRzW2ldO1xuIFx0XHRcdFx0XHR2YXIgcGFyZW50ID0gaW5zdGFsbGVkTW9kdWxlc1twYXJlbnRJZF07XG4gXHRcdFx0XHRcdGlmICghcGFyZW50KSBjb250aW51ZTtcbiBcdFx0XHRcdFx0aWYgKHBhcmVudC5ob3QuX2RlY2xpbmVkRGVwZW5kZW5jaWVzW21vZHVsZUlkXSkge1xuIFx0XHRcdFx0XHRcdHJldHVybiB7XG4gXHRcdFx0XHRcdFx0XHR0eXBlOiBcImRlY2xpbmVkXCIsXG4gXHRcdFx0XHRcdFx0XHRjaGFpbjogY2hhaW4uY29uY2F0KFtwYXJlbnRJZF0pLFxuIFx0XHRcdFx0XHRcdFx0bW9kdWxlSWQ6IG1vZHVsZUlkLFxuIFx0XHRcdFx0XHRcdFx0cGFyZW50SWQ6IHBhcmVudElkXG4gXHRcdFx0XHRcdFx0fTtcbiBcdFx0XHRcdFx0fVxuIFx0XHRcdFx0XHRpZiAob3V0ZGF0ZWRNb2R1bGVzLmluZGV4T2YocGFyZW50SWQpICE9PSAtMSkgY29udGludWU7XG4gXHRcdFx0XHRcdGlmIChwYXJlbnQuaG90Ll9hY2NlcHRlZERlcGVuZGVuY2llc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRcdFx0XHRpZiAoIW91dGRhdGVkRGVwZW5kZW5jaWVzW3BhcmVudElkXSlcbiBcdFx0XHRcdFx0XHRcdG91dGRhdGVkRGVwZW5kZW5jaWVzW3BhcmVudElkXSA9IFtdO1xuIFx0XHRcdFx0XHRcdGFkZEFsbFRvU2V0KG91dGRhdGVkRGVwZW5kZW5jaWVzW3BhcmVudElkXSwgW21vZHVsZUlkXSk7XG4gXHRcdFx0XHRcdFx0Y29udGludWU7XG4gXHRcdFx0XHRcdH1cbiBcdFx0XHRcdFx0ZGVsZXRlIG91dGRhdGVkRGVwZW5kZW5jaWVzW3BhcmVudElkXTtcbiBcdFx0XHRcdFx0b3V0ZGF0ZWRNb2R1bGVzLnB1c2gocGFyZW50SWQpO1xuIFx0XHRcdFx0XHRxdWV1ZS5wdXNoKHtcbiBcdFx0XHRcdFx0XHRjaGFpbjogY2hhaW4uY29uY2F0KFtwYXJlbnRJZF0pLFxuIFx0XHRcdFx0XHRcdGlkOiBwYXJlbnRJZFxuIFx0XHRcdFx0XHR9KTtcbiBcdFx0XHRcdH1cbiBcdFx0XHR9XG5cbiBcdFx0XHRyZXR1cm4ge1xuIFx0XHRcdFx0dHlwZTogXCJhY2NlcHRlZFwiLFxuIFx0XHRcdFx0bW9kdWxlSWQ6IHVwZGF0ZU1vZHVsZUlkLFxuIFx0XHRcdFx0b3V0ZGF0ZWRNb2R1bGVzOiBvdXRkYXRlZE1vZHVsZXMsXG4gXHRcdFx0XHRvdXRkYXRlZERlcGVuZGVuY2llczogb3V0ZGF0ZWREZXBlbmRlbmNpZXNcbiBcdFx0XHR9O1xuIFx0XHR9XG5cbiBcdFx0ZnVuY3Rpb24gYWRkQWxsVG9TZXQoYSwgYikge1xuIFx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgYi5sZW5ndGg7IGkrKykge1xuIFx0XHRcdFx0dmFyIGl0ZW0gPSBiW2ldO1xuIFx0XHRcdFx0aWYgKGEuaW5kZXhPZihpdGVtKSA9PT0gLTEpIGEucHVzaChpdGVtKTtcbiBcdFx0XHR9XG4gXHRcdH1cblxuIFx0XHQvLyBhdCBiZWdpbiBhbGwgdXBkYXRlcyBtb2R1bGVzIGFyZSBvdXRkYXRlZFxuIFx0XHQvLyB0aGUgXCJvdXRkYXRlZFwiIHN0YXR1cyBjYW4gcHJvcGFnYXRlIHRvIHBhcmVudHMgaWYgdGhleSBkb24ndCBhY2NlcHQgdGhlIGNoaWxkcmVuXG4gXHRcdHZhciBvdXRkYXRlZERlcGVuZGVuY2llcyA9IHt9O1xuIFx0XHR2YXIgb3V0ZGF0ZWRNb2R1bGVzID0gW107XG4gXHRcdHZhciBhcHBsaWVkVXBkYXRlID0ge307XG5cbiBcdFx0dmFyIHdhcm5VbmV4cGVjdGVkUmVxdWlyZSA9IGZ1bmN0aW9uIHdhcm5VbmV4cGVjdGVkUmVxdWlyZSgpIHtcbiBcdFx0XHRjb25zb2xlLndhcm4oXG4gXHRcdFx0XHRcIltITVJdIHVuZXhwZWN0ZWQgcmVxdWlyZShcIiArIHJlc3VsdC5tb2R1bGVJZCArIFwiKSB0byBkaXNwb3NlZCBtb2R1bGVcIlxuIFx0XHRcdCk7XG4gXHRcdH07XG5cbiBcdFx0Zm9yICh2YXIgaWQgaW4gaG90VXBkYXRlKSB7XG4gXHRcdFx0aWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChob3RVcGRhdGUsIGlkKSkge1xuIFx0XHRcdFx0bW9kdWxlSWQgPSB0b01vZHVsZUlkKGlkKTtcbiBcdFx0XHRcdC8qKiBAdHlwZSB7VE9ET30gKi9cbiBcdFx0XHRcdHZhciByZXN1bHQ7XG4gXHRcdFx0XHRpZiAoaG90VXBkYXRlW2lkXSkge1xuIFx0XHRcdFx0XHRyZXN1bHQgPSBnZXRBZmZlY3RlZFN0dWZmKG1vZHVsZUlkKTtcbiBcdFx0XHRcdH0gZWxzZSB7XG4gXHRcdFx0XHRcdHJlc3VsdCA9IHtcbiBcdFx0XHRcdFx0XHR0eXBlOiBcImRpc3Bvc2VkXCIsXG4gXHRcdFx0XHRcdFx0bW9kdWxlSWQ6IGlkXG4gXHRcdFx0XHRcdH07XG4gXHRcdFx0XHR9XG4gXHRcdFx0XHQvKiogQHR5cGUge0Vycm9yfGZhbHNlfSAqL1xuIFx0XHRcdFx0dmFyIGFib3J0RXJyb3IgPSBmYWxzZTtcbiBcdFx0XHRcdHZhciBkb0FwcGx5ID0gZmFsc2U7XG4gXHRcdFx0XHR2YXIgZG9EaXNwb3NlID0gZmFsc2U7XG4gXHRcdFx0XHR2YXIgY2hhaW5JbmZvID0gXCJcIjtcbiBcdFx0XHRcdGlmIChyZXN1bHQuY2hhaW4pIHtcbiBcdFx0XHRcdFx0Y2hhaW5JbmZvID0gXCJcXG5VcGRhdGUgcHJvcGFnYXRpb246IFwiICsgcmVzdWx0LmNoYWluLmpvaW4oXCIgLT4gXCIpO1xuIFx0XHRcdFx0fVxuIFx0XHRcdFx0c3dpdGNoIChyZXN1bHQudHlwZSkge1xuIFx0XHRcdFx0XHRjYXNlIFwic2VsZi1kZWNsaW5lZFwiOlxuIFx0XHRcdFx0XHRcdGlmIChvcHRpb25zLm9uRGVjbGluZWQpIG9wdGlvbnMub25EZWNsaW5lZChyZXN1bHQpO1xuIFx0XHRcdFx0XHRcdGlmICghb3B0aW9ucy5pZ25vcmVEZWNsaW5lZClcbiBcdFx0XHRcdFx0XHRcdGFib3J0RXJyb3IgPSBuZXcgRXJyb3IoXG4gXHRcdFx0XHRcdFx0XHRcdFwiQWJvcnRlZCBiZWNhdXNlIG9mIHNlbGYgZGVjbGluZTogXCIgK1xuIFx0XHRcdFx0XHRcdFx0XHRcdHJlc3VsdC5tb2R1bGVJZCArXG4gXHRcdFx0XHRcdFx0XHRcdFx0Y2hhaW5JbmZvXG4gXHRcdFx0XHRcdFx0XHQpO1xuIFx0XHRcdFx0XHRcdGJyZWFrO1xuIFx0XHRcdFx0XHRjYXNlIFwiZGVjbGluZWRcIjpcbiBcdFx0XHRcdFx0XHRpZiAob3B0aW9ucy5vbkRlY2xpbmVkKSBvcHRpb25zLm9uRGVjbGluZWQocmVzdWx0KTtcbiBcdFx0XHRcdFx0XHRpZiAoIW9wdGlvbnMuaWdub3JlRGVjbGluZWQpXG4gXHRcdFx0XHRcdFx0XHRhYm9ydEVycm9yID0gbmV3IEVycm9yKFxuIFx0XHRcdFx0XHRcdFx0XHRcIkFib3J0ZWQgYmVjYXVzZSBvZiBkZWNsaW5lZCBkZXBlbmRlbmN5OiBcIiArXG4gXHRcdFx0XHRcdFx0XHRcdFx0cmVzdWx0Lm1vZHVsZUlkICtcbiBcdFx0XHRcdFx0XHRcdFx0XHRcIiBpbiBcIiArXG4gXHRcdFx0XHRcdFx0XHRcdFx0cmVzdWx0LnBhcmVudElkICtcbiBcdFx0XHRcdFx0XHRcdFx0XHRjaGFpbkluZm9cbiBcdFx0XHRcdFx0XHRcdCk7XG4gXHRcdFx0XHRcdFx0YnJlYWs7XG4gXHRcdFx0XHRcdGNhc2UgXCJ1bmFjY2VwdGVkXCI6XG4gXHRcdFx0XHRcdFx0aWYgKG9wdGlvbnMub25VbmFjY2VwdGVkKSBvcHRpb25zLm9uVW5hY2NlcHRlZChyZXN1bHQpO1xuIFx0XHRcdFx0XHRcdGlmICghb3B0aW9ucy5pZ25vcmVVbmFjY2VwdGVkKVxuIFx0XHRcdFx0XHRcdFx0YWJvcnRFcnJvciA9IG5ldyBFcnJvcihcbiBcdFx0XHRcdFx0XHRcdFx0XCJBYm9ydGVkIGJlY2F1c2UgXCIgKyBtb2R1bGVJZCArIFwiIGlzIG5vdCBhY2NlcHRlZFwiICsgY2hhaW5JbmZvXG4gXHRcdFx0XHRcdFx0XHQpO1xuIFx0XHRcdFx0XHRcdGJyZWFrO1xuIFx0XHRcdFx0XHRjYXNlIFwiYWNjZXB0ZWRcIjpcbiBcdFx0XHRcdFx0XHRpZiAob3B0aW9ucy5vbkFjY2VwdGVkKSBvcHRpb25zLm9uQWNjZXB0ZWQocmVzdWx0KTtcbiBcdFx0XHRcdFx0XHRkb0FwcGx5ID0gdHJ1ZTtcbiBcdFx0XHRcdFx0XHRicmVhaztcbiBcdFx0XHRcdFx0Y2FzZSBcImRpc3Bvc2VkXCI6XG4gXHRcdFx0XHRcdFx0aWYgKG9wdGlvbnMub25EaXNwb3NlZCkgb3B0aW9ucy5vbkRpc3Bvc2VkKHJlc3VsdCk7XG4gXHRcdFx0XHRcdFx0ZG9EaXNwb3NlID0gdHJ1ZTtcbiBcdFx0XHRcdFx0XHRicmVhaztcbiBcdFx0XHRcdFx0ZGVmYXVsdDpcbiBcdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJVbmV4Y2VwdGlvbiB0eXBlIFwiICsgcmVzdWx0LnR5cGUpO1xuIFx0XHRcdFx0fVxuIFx0XHRcdFx0aWYgKGFib3J0RXJyb3IpIHtcbiBcdFx0XHRcdFx0aG90U2V0U3RhdHVzKFwiYWJvcnRcIik7XG4gXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChhYm9ydEVycm9yKTtcbiBcdFx0XHRcdH1cbiBcdFx0XHRcdGlmIChkb0FwcGx5KSB7XG4gXHRcdFx0XHRcdGFwcGxpZWRVcGRhdGVbbW9kdWxlSWRdID0gaG90VXBkYXRlW21vZHVsZUlkXTtcbiBcdFx0XHRcdFx0YWRkQWxsVG9TZXQob3V0ZGF0ZWRNb2R1bGVzLCByZXN1bHQub3V0ZGF0ZWRNb2R1bGVzKTtcbiBcdFx0XHRcdFx0Zm9yIChtb2R1bGVJZCBpbiByZXN1bHQub3V0ZGF0ZWREZXBlbmRlbmNpZXMpIHtcbiBcdFx0XHRcdFx0XHRpZiAoXG4gXHRcdFx0XHRcdFx0XHRPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoXG4gXHRcdFx0XHRcdFx0XHRcdHJlc3VsdC5vdXRkYXRlZERlcGVuZGVuY2llcyxcbiBcdFx0XHRcdFx0XHRcdFx0bW9kdWxlSWRcbiBcdFx0XHRcdFx0XHRcdClcbiBcdFx0XHRcdFx0XHQpIHtcbiBcdFx0XHRcdFx0XHRcdGlmICghb3V0ZGF0ZWREZXBlbmRlbmNpZXNbbW9kdWxlSWRdKVxuIFx0XHRcdFx0XHRcdFx0XHRvdXRkYXRlZERlcGVuZGVuY2llc1ttb2R1bGVJZF0gPSBbXTtcbiBcdFx0XHRcdFx0XHRcdGFkZEFsbFRvU2V0KFxuIFx0XHRcdFx0XHRcdFx0XHRvdXRkYXRlZERlcGVuZGVuY2llc1ttb2R1bGVJZF0sXG4gXHRcdFx0XHRcdFx0XHRcdHJlc3VsdC5vdXRkYXRlZERlcGVuZGVuY2llc1ttb2R1bGVJZF1cbiBcdFx0XHRcdFx0XHRcdCk7XG4gXHRcdFx0XHRcdFx0fVxuIFx0XHRcdFx0XHR9XG4gXHRcdFx0XHR9XG4gXHRcdFx0XHRpZiAoZG9EaXNwb3NlKSB7XG4gXHRcdFx0XHRcdGFkZEFsbFRvU2V0KG91dGRhdGVkTW9kdWxlcywgW3Jlc3VsdC5tb2R1bGVJZF0pO1xuIFx0XHRcdFx0XHRhcHBsaWVkVXBkYXRlW21vZHVsZUlkXSA9IHdhcm5VbmV4cGVjdGVkUmVxdWlyZTtcbiBcdFx0XHRcdH1cbiBcdFx0XHR9XG4gXHRcdH1cblxuIFx0XHQvLyBTdG9yZSBzZWxmIGFjY2VwdGVkIG91dGRhdGVkIG1vZHVsZXMgdG8gcmVxdWlyZSB0aGVtIGxhdGVyIGJ5IHRoZSBtb2R1bGUgc3lzdGVtXG4gXHRcdHZhciBvdXRkYXRlZFNlbGZBY2NlcHRlZE1vZHVsZXMgPSBbXTtcbiBcdFx0Zm9yIChpID0gMDsgaSA8IG91dGRhdGVkTW9kdWxlcy5sZW5ndGg7IGkrKykge1xuIFx0XHRcdG1vZHVsZUlkID0gb3V0ZGF0ZWRNb2R1bGVzW2ldO1xuIFx0XHRcdGlmIChcbiBcdFx0XHRcdGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdICYmXG4gXHRcdFx0XHRpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5ob3QuX3NlbGZBY2NlcHRlZCAmJlxuIFx0XHRcdFx0Ly8gcmVtb3ZlZCBzZWxmLWFjY2VwdGVkIG1vZHVsZXMgc2hvdWxkIG5vdCBiZSByZXF1aXJlZFxuIFx0XHRcdFx0YXBwbGllZFVwZGF0ZVttb2R1bGVJZF0gIT09IHdhcm5VbmV4cGVjdGVkUmVxdWlyZVxuIFx0XHRcdCkge1xuIFx0XHRcdFx0b3V0ZGF0ZWRTZWxmQWNjZXB0ZWRNb2R1bGVzLnB1c2goe1xuIFx0XHRcdFx0XHRtb2R1bGU6IG1vZHVsZUlkLFxuIFx0XHRcdFx0XHRlcnJvckhhbmRsZXI6IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmhvdC5fc2VsZkFjY2VwdGVkXG4gXHRcdFx0XHR9KTtcbiBcdFx0XHR9XG4gXHRcdH1cblxuIFx0XHQvLyBOb3cgaW4gXCJkaXNwb3NlXCIgcGhhc2VcbiBcdFx0aG90U2V0U3RhdHVzKFwiZGlzcG9zZVwiKTtcbiBcdFx0T2JqZWN0LmtleXMoaG90QXZhaWxhYmxlRmlsZXNNYXApLmZvckVhY2goZnVuY3Rpb24oY2h1bmtJZCkge1xuIFx0XHRcdGlmIChob3RBdmFpbGFibGVGaWxlc01hcFtjaHVua0lkXSA9PT0gZmFsc2UpIHtcbiBcdFx0XHRcdGhvdERpc3Bvc2VDaHVuayhjaHVua0lkKTtcbiBcdFx0XHR9XG4gXHRcdH0pO1xuXG4gXHRcdHZhciBpZHg7XG4gXHRcdHZhciBxdWV1ZSA9IG91dGRhdGVkTW9kdWxlcy5zbGljZSgpO1xuIFx0XHR3aGlsZSAocXVldWUubGVuZ3RoID4gMCkge1xuIFx0XHRcdG1vZHVsZUlkID0gcXVldWUucG9wKCk7XG4gXHRcdFx0bW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF07XG4gXHRcdFx0aWYgKCFtb2R1bGUpIGNvbnRpbnVlO1xuXG4gXHRcdFx0dmFyIGRhdGEgPSB7fTtcblxuIFx0XHRcdC8vIENhbGwgZGlzcG9zZSBoYW5kbGVyc1xuIFx0XHRcdHZhciBkaXNwb3NlSGFuZGxlcnMgPSBtb2R1bGUuaG90Ll9kaXNwb3NlSGFuZGxlcnM7XG4gXHRcdFx0Zm9yIChqID0gMDsgaiA8IGRpc3Bvc2VIYW5kbGVycy5sZW5ndGg7IGorKykge1xuIFx0XHRcdFx0Y2IgPSBkaXNwb3NlSGFuZGxlcnNbal07XG4gXHRcdFx0XHRjYihkYXRhKTtcbiBcdFx0XHR9XG4gXHRcdFx0aG90Q3VycmVudE1vZHVsZURhdGFbbW9kdWxlSWRdID0gZGF0YTtcblxuIFx0XHRcdC8vIGRpc2FibGUgbW9kdWxlICh0aGlzIGRpc2FibGVzIHJlcXVpcmVzIGZyb20gdGhpcyBtb2R1bGUpXG4gXHRcdFx0bW9kdWxlLmhvdC5hY3RpdmUgPSBmYWxzZTtcblxuIFx0XHRcdC8vIHJlbW92ZSBtb2R1bGUgZnJvbSBjYWNoZVxuIFx0XHRcdGRlbGV0ZSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXTtcblxuIFx0XHRcdC8vIHdoZW4gZGlzcG9zaW5nIHRoZXJlIGlzIG5vIG5lZWQgdG8gY2FsbCBkaXNwb3NlIGhhbmRsZXJcbiBcdFx0XHRkZWxldGUgb3V0ZGF0ZWREZXBlbmRlbmNpZXNbbW9kdWxlSWRdO1xuXG4gXHRcdFx0Ly8gcmVtb3ZlIFwicGFyZW50c1wiIHJlZmVyZW5jZXMgZnJvbSBhbGwgY2hpbGRyZW5cbiBcdFx0XHRmb3IgKGogPSAwOyBqIDwgbW9kdWxlLmNoaWxkcmVuLmxlbmd0aDsgaisrKSB7XG4gXHRcdFx0XHR2YXIgY2hpbGQgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZS5jaGlsZHJlbltqXV07XG4gXHRcdFx0XHRpZiAoIWNoaWxkKSBjb250aW51ZTtcbiBcdFx0XHRcdGlkeCA9IGNoaWxkLnBhcmVudHMuaW5kZXhPZihtb2R1bGVJZCk7XG4gXHRcdFx0XHRpZiAoaWR4ID49IDApIHtcbiBcdFx0XHRcdFx0Y2hpbGQucGFyZW50cy5zcGxpY2UoaWR4LCAxKTtcbiBcdFx0XHRcdH1cbiBcdFx0XHR9XG4gXHRcdH1cblxuIFx0XHQvLyByZW1vdmUgb3V0ZGF0ZWQgZGVwZW5kZW5jeSBmcm9tIG1vZHVsZSBjaGlsZHJlblxuIFx0XHR2YXIgZGVwZW5kZW5jeTtcbiBcdFx0dmFyIG1vZHVsZU91dGRhdGVkRGVwZW5kZW5jaWVzO1xuIFx0XHRmb3IgKG1vZHVsZUlkIGluIG91dGRhdGVkRGVwZW5kZW5jaWVzKSB7XG4gXHRcdFx0aWYgKFxuIFx0XHRcdFx0T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG91dGRhdGVkRGVwZW5kZW5jaWVzLCBtb2R1bGVJZClcbiBcdFx0XHQpIHtcbiBcdFx0XHRcdG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdO1xuIFx0XHRcdFx0aWYgKG1vZHVsZSkge1xuIFx0XHRcdFx0XHRtb2R1bGVPdXRkYXRlZERlcGVuZGVuY2llcyA9IG91dGRhdGVkRGVwZW5kZW5jaWVzW21vZHVsZUlkXTtcbiBcdFx0XHRcdFx0Zm9yIChqID0gMDsgaiA8IG1vZHVsZU91dGRhdGVkRGVwZW5kZW5jaWVzLmxlbmd0aDsgaisrKSB7XG4gXHRcdFx0XHRcdFx0ZGVwZW5kZW5jeSA9IG1vZHVsZU91dGRhdGVkRGVwZW5kZW5jaWVzW2pdO1xuIFx0XHRcdFx0XHRcdGlkeCA9IG1vZHVsZS5jaGlsZHJlbi5pbmRleE9mKGRlcGVuZGVuY3kpO1xuIFx0XHRcdFx0XHRcdGlmIChpZHggPj0gMCkgbW9kdWxlLmNoaWxkcmVuLnNwbGljZShpZHgsIDEpO1xuIFx0XHRcdFx0XHR9XG4gXHRcdFx0XHR9XG4gXHRcdFx0fVxuIFx0XHR9XG5cbiBcdFx0Ly8gTm93IGluIFwiYXBwbHlcIiBwaGFzZVxuIFx0XHRob3RTZXRTdGF0dXMoXCJhcHBseVwiKTtcblxuIFx0XHRob3RDdXJyZW50SGFzaCA9IGhvdFVwZGF0ZU5ld0hhc2g7XG5cbiBcdFx0Ly8gaW5zZXJ0IG5ldyBjb2RlXG4gXHRcdGZvciAobW9kdWxlSWQgaW4gYXBwbGllZFVwZGF0ZSkge1xuIFx0XHRcdGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYXBwbGllZFVwZGF0ZSwgbW9kdWxlSWQpKSB7XG4gXHRcdFx0XHRtb2R1bGVzW21vZHVsZUlkXSA9IGFwcGxpZWRVcGRhdGVbbW9kdWxlSWRdO1xuIFx0XHRcdH1cbiBcdFx0fVxuXG4gXHRcdC8vIGNhbGwgYWNjZXB0IGhhbmRsZXJzXG4gXHRcdHZhciBlcnJvciA9IG51bGw7XG4gXHRcdGZvciAobW9kdWxlSWQgaW4gb3V0ZGF0ZWREZXBlbmRlbmNpZXMpIHtcbiBcdFx0XHRpZiAoXG4gXHRcdFx0XHRPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3V0ZGF0ZWREZXBlbmRlbmNpZXMsIG1vZHVsZUlkKVxuIFx0XHRcdCkge1xuIFx0XHRcdFx0bW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF07XG4gXHRcdFx0XHRpZiAobW9kdWxlKSB7XG4gXHRcdFx0XHRcdG1vZHVsZU91dGRhdGVkRGVwZW5kZW5jaWVzID0gb3V0ZGF0ZWREZXBlbmRlbmNpZXNbbW9kdWxlSWRdO1xuIFx0XHRcdFx0XHR2YXIgY2FsbGJhY2tzID0gW107XG4gXHRcdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBtb2R1bGVPdXRkYXRlZERlcGVuZGVuY2llcy5sZW5ndGg7IGkrKykge1xuIFx0XHRcdFx0XHRcdGRlcGVuZGVuY3kgPSBtb2R1bGVPdXRkYXRlZERlcGVuZGVuY2llc1tpXTtcbiBcdFx0XHRcdFx0XHRjYiA9IG1vZHVsZS5ob3QuX2FjY2VwdGVkRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuIFx0XHRcdFx0XHRcdGlmIChjYikge1xuIFx0XHRcdFx0XHRcdFx0aWYgKGNhbGxiYWNrcy5pbmRleE9mKGNiKSAhPT0gLTEpIGNvbnRpbnVlO1xuIFx0XHRcdFx0XHRcdFx0Y2FsbGJhY2tzLnB1c2goY2IpO1xuIFx0XHRcdFx0XHRcdH1cbiBcdFx0XHRcdFx0fVxuIFx0XHRcdFx0XHRmb3IgKGkgPSAwOyBpIDwgY2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gXHRcdFx0XHRcdFx0Y2IgPSBjYWxsYmFja3NbaV07XG4gXHRcdFx0XHRcdFx0dHJ5IHtcbiBcdFx0XHRcdFx0XHRcdGNiKG1vZHVsZU91dGRhdGVkRGVwZW5kZW5jaWVzKTtcbiBcdFx0XHRcdFx0XHR9IGNhdGNoIChlcnIpIHtcbiBcdFx0XHRcdFx0XHRcdGlmIChvcHRpb25zLm9uRXJyb3JlZCkge1xuIFx0XHRcdFx0XHRcdFx0XHRvcHRpb25zLm9uRXJyb3JlZCh7XG4gXHRcdFx0XHRcdFx0XHRcdFx0dHlwZTogXCJhY2NlcHQtZXJyb3JlZFwiLFxuIFx0XHRcdFx0XHRcdFx0XHRcdG1vZHVsZUlkOiBtb2R1bGVJZCxcbiBcdFx0XHRcdFx0XHRcdFx0XHRkZXBlbmRlbmN5SWQ6IG1vZHVsZU91dGRhdGVkRGVwZW5kZW5jaWVzW2ldLFxuIFx0XHRcdFx0XHRcdFx0XHRcdGVycm9yOiBlcnJcbiBcdFx0XHRcdFx0XHRcdFx0fSk7XG4gXHRcdFx0XHRcdFx0XHR9XG4gXHRcdFx0XHRcdFx0XHRpZiAoIW9wdGlvbnMuaWdub3JlRXJyb3JlZCkge1xuIFx0XHRcdFx0XHRcdFx0XHRpZiAoIWVycm9yKSBlcnJvciA9IGVycjtcbiBcdFx0XHRcdFx0XHRcdH1cbiBcdFx0XHRcdFx0XHR9XG4gXHRcdFx0XHRcdH1cbiBcdFx0XHRcdH1cbiBcdFx0XHR9XG4gXHRcdH1cblxuIFx0XHQvLyBMb2FkIHNlbGYgYWNjZXB0ZWQgbW9kdWxlc1xuIFx0XHRmb3IgKGkgPSAwOyBpIDwgb3V0ZGF0ZWRTZWxmQWNjZXB0ZWRNb2R1bGVzLmxlbmd0aDsgaSsrKSB7XG4gXHRcdFx0dmFyIGl0ZW0gPSBvdXRkYXRlZFNlbGZBY2NlcHRlZE1vZHVsZXNbaV07XG4gXHRcdFx0bW9kdWxlSWQgPSBpdGVtLm1vZHVsZTtcbiBcdFx0XHRob3RDdXJyZW50UGFyZW50cyA9IFttb2R1bGVJZF07XG4gXHRcdFx0dHJ5IHtcbiBcdFx0XHRcdF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpO1xuIFx0XHRcdH0gY2F0Y2ggKGVycikge1xuIFx0XHRcdFx0aWYgKHR5cGVvZiBpdGVtLmVycm9ySGFuZGxlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gXHRcdFx0XHRcdHRyeSB7XG4gXHRcdFx0XHRcdFx0aXRlbS5lcnJvckhhbmRsZXIoZXJyKTtcbiBcdFx0XHRcdFx0fSBjYXRjaCAoZXJyMikge1xuIFx0XHRcdFx0XHRcdGlmIChvcHRpb25zLm9uRXJyb3JlZCkge1xuIFx0XHRcdFx0XHRcdFx0b3B0aW9ucy5vbkVycm9yZWQoe1xuIFx0XHRcdFx0XHRcdFx0XHR0eXBlOiBcInNlbGYtYWNjZXB0LWVycm9yLWhhbmRsZXItZXJyb3JlZFwiLFxuIFx0XHRcdFx0XHRcdFx0XHRtb2R1bGVJZDogbW9kdWxlSWQsXG4gXHRcdFx0XHRcdFx0XHRcdGVycm9yOiBlcnIyLFxuIFx0XHRcdFx0XHRcdFx0XHRvcmlnaW5hbEVycm9yOiBlcnJcbiBcdFx0XHRcdFx0XHRcdH0pO1xuIFx0XHRcdFx0XHRcdH1cbiBcdFx0XHRcdFx0XHRpZiAoIW9wdGlvbnMuaWdub3JlRXJyb3JlZCkge1xuIFx0XHRcdFx0XHRcdFx0aWYgKCFlcnJvcikgZXJyb3IgPSBlcnIyO1xuIFx0XHRcdFx0XHRcdH1cbiBcdFx0XHRcdFx0XHRpZiAoIWVycm9yKSBlcnJvciA9IGVycjtcbiBcdFx0XHRcdFx0fVxuIFx0XHRcdFx0fSBlbHNlIHtcbiBcdFx0XHRcdFx0aWYgKG9wdGlvbnMub25FcnJvcmVkKSB7XG4gXHRcdFx0XHRcdFx0b3B0aW9ucy5vbkVycm9yZWQoe1xuIFx0XHRcdFx0XHRcdFx0dHlwZTogXCJzZWxmLWFjY2VwdC1lcnJvcmVkXCIsXG4gXHRcdFx0XHRcdFx0XHRtb2R1bGVJZDogbW9kdWxlSWQsXG4gXHRcdFx0XHRcdFx0XHRlcnJvcjogZXJyXG4gXHRcdFx0XHRcdFx0fSk7XG4gXHRcdFx0XHRcdH1cbiBcdFx0XHRcdFx0aWYgKCFvcHRpb25zLmlnbm9yZUVycm9yZWQpIHtcbiBcdFx0XHRcdFx0XHRpZiAoIWVycm9yKSBlcnJvciA9IGVycjtcbiBcdFx0XHRcdFx0fVxuIFx0XHRcdFx0fVxuIFx0XHRcdH1cbiBcdFx0fVxuXG4gXHRcdC8vIGhhbmRsZSBlcnJvcnMgaW4gYWNjZXB0IGhhbmRsZXJzIGFuZCBzZWxmIGFjY2VwdGVkIG1vZHVsZSBsb2FkXG4gXHRcdGlmIChlcnJvcikge1xuIFx0XHRcdGhvdFNldFN0YXR1cyhcImZhaWxcIik7XG4gXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiBcdFx0fVxuXG4gXHRcdGhvdFNldFN0YXR1cyhcImlkbGVcIik7XG4gXHRcdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlKSB7XG4gXHRcdFx0cmVzb2x2ZShvdXRkYXRlZE1vZHVsZXMpO1xuIFx0XHR9KTtcbiBcdH1cblxuIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gb2JqZWN0IHRvIHN0b3JlIGxvYWRlZCBhbmQgbG9hZGluZyBjaHVua3NcbiBcdC8vIHVuZGVmaW5lZCA9IGNodW5rIG5vdCBsb2FkZWQsIG51bGwgPSBjaHVuayBwcmVsb2FkZWQvcHJlZmV0Y2hlZFxuIFx0Ly8gUHJvbWlzZSA9IGNodW5rIGxvYWRpbmcsIDAgPSBjaHVuayBsb2FkZWRcbiBcdHZhciBpbnN0YWxsZWRDaHVua3MgPSB7XG4gXHRcdFwiZmRzLWRlbW8uYnVuZGxlLm1pblwiOiAwXG4gXHR9O1xuXG4gXHR2YXIgZGVmZXJyZWRNb2R1bGVzID0gW107XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9LFxuIFx0XHRcdGhvdDogaG90Q3JlYXRlTW9kdWxlKG1vZHVsZUlkKSxcbiBcdFx0XHRwYXJlbnRzOiAoaG90Q3VycmVudFBhcmVudHNUZW1wID0gaG90Q3VycmVudFBhcmVudHMsIGhvdEN1cnJlbnRQYXJlbnRzID0gW10sIGhvdEN1cnJlbnRQYXJlbnRzVGVtcCksXG4gXHRcdFx0Y2hpbGRyZW46IFtdXG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIGhvdENyZWF0ZVJlcXVpcmUobW9kdWxlSWQpKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBfX3dlYnBhY2tfaGFzaF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmggPSBmdW5jdGlvbigpIHsgcmV0dXJuIGhvdEN1cnJlbnRIYXNoOyB9O1xuXG4gXHR2YXIganNvbnBBcnJheSA9IHdpbmRvd1tcIndlYnBhY2tKc29ucFwiXSA9IHdpbmRvd1tcIndlYnBhY2tKc29ucFwiXSB8fCBbXTtcbiBcdHZhciBvbGRKc29ucEZ1bmN0aW9uID0ganNvbnBBcnJheS5wdXNoLmJpbmQoanNvbnBBcnJheSk7XG4gXHRqc29ucEFycmF5LnB1c2ggPSB3ZWJwYWNrSnNvbnBDYWxsYmFjaztcbiBcdGpzb25wQXJyYXkgPSBqc29ucEFycmF5LnNsaWNlKCk7XG4gXHRmb3IodmFyIGkgPSAwOyBpIDwganNvbnBBcnJheS5sZW5ndGg7IGkrKykgd2VicGFja0pzb25wQ2FsbGJhY2soanNvbnBBcnJheVtpXSk7XG4gXHR2YXIgcGFyZW50SnNvbnBGdW5jdGlvbiA9IG9sZEpzb25wRnVuY3Rpb247XG5cblxuIFx0Ly8gYWRkIGVudHJ5IG1vZHVsZSB0byBkZWZlcnJlZCBsaXN0XG4gXHRkZWZlcnJlZE1vZHVsZXMucHVzaChbXCIuL3dlYmFwcC9mZHMtYm9vdHN0cmFwLmpzXCIsXCJmZHMtZGVtby52ZW5kb3IubWluXCJdKTtcbiBcdC8vIHJ1biBkZWZlcnJlZCBtb2R1bGVzIHdoZW4gcmVhZHlcbiBcdHJldHVybiBjaGVja0RlZmVycmVkTW9kdWxlcygpO1xuIiwiZnVuY3Rpb24gd2VicGFja0VtcHR5QXN5bmNDb250ZXh0KHJlcSkge1xuXHQvLyBIZXJlIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKSBpcyB1c2VkIGluc3RlYWQgb2YgbmV3IFByb21pc2UoKSB0byBwcmV2ZW50XG5cdC8vIHVuY2F1Z2h0IGV4Y2VwdGlvbiBwb3BwaW5nIHVwIGluIGRldnRvb2xzXG5cdHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fSk7XG59XG53ZWJwYWNrRW1wdHlBc3luY0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gW107IH07XG53ZWJwYWNrRW1wdHlBc3luY0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tFbXB0eUFzeW5jQ29udGV4dDtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0VtcHR5QXN5bmNDb250ZXh0O1xud2VicGFja0VtcHR5QXN5bmNDb250ZXh0LmlkID0gXCIuL25vZGVfbW9kdWxlcy9AYW5ndWxhci9jb3JlL2Zlc201IGxhenkgcmVjdXJzaXZlXCI7IiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZVxuICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoXG4gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuXG4gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMFxuICogKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aFxuICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCBGZHNTdG9yYWdlU2VydmljZSBmcm9tICcuL3NlcnZpY2VzL2Zkcy1zdG9yYWdlLnNlcnZpY2UnO1xuLyoqXG4gKiBGZHNDb21tb25zTW9kdWxlIGNvbnN0cnVjdG9yLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICovXG5cbmZ1bmN0aW9uIEZkc0NvbW1vbnNNb2R1bGUoKSB7fVxuXG5GZHNDb21tb25zTW9kdWxlLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IEZkc0NvbW1vbnNNb2R1bGVcbn07XG5GZHNDb21tb25zTW9kdWxlLmFubm90YXRpb25zID0gW25ldyBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtdLFxuICBkZWNsYXJhdGlvbnM6IFtdLFxuICBleHBvcnRzOiBbXSxcbiAgcHJvdmlkZXJzOiBbRmRzU3RvcmFnZVNlcnZpY2VdXG59KV07XG5leHBvcnQgeyBGZHNDb21tb25zTW9kdWxlLCBGZHNTdG9yYWdlU2VydmljZSB9OyIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmVcbiAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aFxuICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlxuICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjBcbiAqICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGhcbiAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IHRyaWdnZXIsIHN0YXRlLCBzdHlsZSwgdHJhbnNpdGlvbiwgYW5pbWF0ZSB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuLyoqXG4gKiBGZHNBbmltYXRpb25zIGNvbnN0cnVjdG9yLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICovXG5cbmZ1bmN0aW9uIEZkc0FuaW1hdGlvbnMoKSB7fVxuXG5GZHNBbmltYXRpb25zLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IEZkc0FuaW1hdGlvbnMsXG5cbiAgLyoqXG4gICAqIEZhZGUgYW5pbWF0aW9uXG4gICAqL1xuICBmYWRlQW5pbWF0aW9uOiB0cmlnZ2VyKCdyb3V0ZUFuaW1hdGlvbicsIFtzdGF0ZSgnKicsIHN0eWxlKHtcbiAgICBvcGFjaXR5OiAxXG4gIH0pKSwgdHJhbnNpdGlvbignOmVudGVyJywgW3N0eWxlKHtcbiAgICBvcGFjaXR5OiAwXG4gIH0pLCBhbmltYXRlKCcwLjVzIGVhc2UtaW4nKV0pLCB0cmFuc2l0aW9uKCc6bGVhdmUnLCBbYW5pbWF0ZSgnMC41cyBlYXNlLW91dCcsIHN0eWxlKHtcbiAgICBvcGFjaXR5OiAwXG4gIH0pKV0pXSksXG5cbiAgLyoqXG4gICAqIFNsaWRlIGluIGZyb20gdGhlIGxlZnQgYW5pbWF0aW9uXG4gICAqL1xuICBzbGlkZUluTGVmdEFuaW1hdGlvbjogdHJpZ2dlcigncm91dGVBbmltYXRpb24nLCBbc3RhdGUoJyonLCBzdHlsZSh7XG4gICAgb3BhY2l0eTogMSxcbiAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKDApJ1xuICB9KSksIHRyYW5zaXRpb24oJzplbnRlcicsIFtzdHlsZSh7XG4gICAgb3BhY2l0eTogMCxcbiAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKC0xMDAlKSdcbiAgfSksIGFuaW1hdGUoJzAuNXMgZWFzZS1pbicpXSksIHRyYW5zaXRpb24oJzpsZWF2ZScsIFthbmltYXRlKCcwLjVzIGVhc2Utb3V0Jywgc3R5bGUoe1xuICAgIG9wYWNpdHk6IDAsXG4gICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgxMDAlKSdcbiAgfSkpXSldKSxcblxuICAvKipcbiAgICogU2xpZGUgaW4gZnJvbSB0aGUgdG9wIGFuaW1hdGlvblxuICAgKi9cbiAgc2xpZGVJbkRvd25BbmltYXRpb246IHRyaWdnZXIoJ3JvdXRlQW5pbWF0aW9uJywgW3N0YXRlKCcqJywgc3R5bGUoe1xuICAgIG9wYWNpdHk6IDEsXG4gICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgwKSdcbiAgfSkpLCB0cmFuc2l0aW9uKCc6ZW50ZXInLCBbc3R5bGUoe1xuICAgIG9wYWNpdHk6IDAsXG4gICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgtMTAwJSknXG4gIH0pLCBhbmltYXRlKCcwLjVzIGVhc2UtaW4nKV0pLCB0cmFuc2l0aW9uKCc6bGVhdmUnLCBbYW5pbWF0ZSgnMC41cyBlYXNlLW91dCcsIHN0eWxlKHtcbiAgICBvcGFjaXR5OiAwLFxuICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoMTAwJSknXG4gIH0pKV0pXSksXG5cbiAgLyoqXG4gICAqIEZseSBpbi9vdXQgYW5pbWF0aW9uXG4gICAqL1xuICBmbHlJbk91dEFuaW1hdGlvbjogdHJpZ2dlcignZmx5SW5PdXQnLCBbc3RhdGUoJ2luJywgc3R5bGUoe1xuICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoMCknXG4gIH0pKSwgdHJhbnNpdGlvbigndm9pZCA9PiAqJywgW3N0eWxlKHtcbiAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKDEwMCUpJ1xuICB9KSwgYW5pbWF0ZSgnMC40cyAwLjFzIGVhc2UtaW4nKV0pLCB0cmFuc2l0aW9uKCcqID0+IHZvaWQnLCBhbmltYXRlKCcwLjJzIGVhc2Utb3V0Jywgc3R5bGUoe1xuICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoLTEwMCUpJ1xuICB9KSkpXSksXG5cbiAgLyoqXG4gICAqIEZseSBpbi9vdXQgYW5pbWF0aW9uXG4gICAqL1xuICBmYWRlSW5PdXRBbmltYXRpb246IHRyaWdnZXIoJ2ZhZGVJbk91dCcsIFtzdGF0ZSgnaW4nLCBzdHlsZSh7XG4gICAgb3BhY2l0eTogMVxuICB9KSksIHRyYW5zaXRpb24oJ3ZvaWQgPT4gKicsIFtzdHlsZSh7XG4gICAgb3BhY2l0eTogMFxuICB9KSwgYW5pbWF0ZSgnMC41cyAwLjFzIGVhc2UtaW4nKV0pLCB0cmFuc2l0aW9uKCcqID0+IHZvaWQnLCBhbmltYXRlKCcwLjVzIGVhc2Utb3V0Jywgc3R5bGUoe1xuICAgIG9wYWNpdHk6IDBcbiAgfSkpKV0pXG59O1xuZXhwb3J0IGRlZmF1bHQgbmV3IEZkc0FuaW1hdGlvbnMoKTsiLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlXG4gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGhcbiAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5cbiAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wXG4gKiAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoXG4gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vLyBTdG9yZSBpdGVtcyBmb3IgdHdvIGRheXMgYmVmb3JlIGJlaW5nIGVsaWdpYmxlIGZvciByZW1vdmFsLlxudmFyIE1JTExJU19QRVJfREFZID0gODY0MDAwMDA7XG52YXIgVFdPX0RBWVMgPSBNSUxMSVNfUEVSX0RBWSAqIDI7XG5cbnZhciBpc1VuZGVmaW5lZCA9IGZ1bmN0aW9uIGlzVW5kZWZpbmVkKG9iaikge1xuICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCc7XG59O1xuXG52YXIgaXNOdWxsID0gZnVuY3Rpb24gaXNOdWxsKG9iaikge1xuICByZXR1cm4gb2JqID09PSBudWxsO1xufTtcblxudmFyIGlzRGVmaW5lZEFuZE5vdE51bGwgPSBmdW5jdGlvbiBpc0RlZmluZWRBbmROb3ROdWxsKG9iaikge1xuICByZXR1cm4gIWlzVW5kZWZpbmVkKG9iaikgJiYgIWlzTnVsbChvYmopO1xufTtcbi8qKlxuICogQ2hlY2tzIHRoZSBleHBpcmF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIGVudHJ5LlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBlbnRyeVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cblxuXG52YXIgY2hlY2tFeHBpcmF0aW9uID0gZnVuY3Rpb24gY2hlY2tFeHBpcmF0aW9uKGVudHJ5KSB7XG4gIGlmIChpc0RlZmluZWRBbmROb3ROdWxsKGVudHJ5LmV4cGlyZXMpKSB7XG4gICAgLy8gZ2V0IHRoZSBleHBpcmF0aW9uXG4gICAgdmFyIGV4cGlyZXMgPSBuZXcgRGF0ZShlbnRyeS5leHBpcmVzKTtcbiAgICB2YXIgbm93ID0gbmV3IERhdGUoKTsgLy8gcmV0dXJuIHdoZXRoZXIgdGhlIGV4cGlyYXRpb24gZGF0ZSBoYXMgcGFzc2VkXG5cbiAgICByZXR1cm4gZXhwaXJlcy52YWx1ZU9mKCkgPCBub3cudmFsdWVPZigpO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufTtcbi8qKlxuICogR2V0cyBhbiBlbnR5IGZvciB0aGUga2V5LiBUaGUgZW50cnkgZXhwaXJhdGlvbiBpcyBub3QgY2hlY2tlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKi9cblxuXG52YXIgZ2V0RW50cnkgPSBmdW5jdGlvbiBnZXRFbnRyeShrZXkpIHtcbiAgdHJ5IHtcbiAgICAvLyBwYXJzZSB0aGUgZW50cnlcbiAgICB2YXIgZW50cnkgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSkpOyAvLyBlbnN1cmUgdGhlIGVudHJ5IGFuZCBpdGVtIGFyZSBwcmVzZW50XG5cbiAgICBpZiAoaXNEZWZpbmVkQW5kTm90TnVsbChlbnRyeSkpIHtcbiAgICAgIHJldHVybiBlbnRyeTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59O1xuLyoqXG4gKiBGZHNTdG9yYWdlU2VydmljZSBjb25zdHJ1Y3Rvci5cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5cblxuZnVuY3Rpb24gRmRzU3RvcmFnZVNlcnZpY2UoKSB7fVxuXG5GZHNTdG9yYWdlU2VydmljZS5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBGZHNTdG9yYWdlU2VydmljZSxcblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIHN0b3JhZ2UuIEl0ZW1zIHdpbGwgYmUgcGVyc2lzdGVkIGZvciB0d28gZGF5cy4gT25jZSB0aGUgc2NyaXB0cyBydW5zXG4gICAqIHRoZXJlYWZ0ZXIsIGFsbCBlbGlnaWJsZSBpdGVtcyB3aWxsIGJlIHJlbW92ZWQuIFRoaXMgc3RyYXRlZ3kgZG9lcyBub3Qgc3VwcG9ydCBwZXJzaXN0ZW5jZS5cbiAgICovXG4gIGluaXQ6IGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsb2NhbFN0b3JhZ2UubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIGdldCB0aGUgbmV4dCBpdGVtXG4gICAgICAgIHZhciBrZXkgPSBsb2NhbFN0b3JhZ2Uua2V5KGkpOyAvLyBhdHRlbXB0IHRvIGdldCB0aGUgaXRlbSB3aGljaCB3aWxsIGV4cGlyZSBpZiBuZWNlc3NhcnlcblxuICAgICAgICB0aGlzLmdldEl0ZW0oa2V5KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHsvLyBEbyBub3RoaW5nXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBTdG9yZXMgdGhlIHNwZWNpZmllZCBpdGVtLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBpdGVtXG4gICAqIEBwYXJhbSB7aW50ZWdlcn0gZXhwaXJlc1xuICAgKi9cbiAgc2V0SXRlbTogZnVuY3Rpb24gc2V0SXRlbShrZXksIGl0ZW0sIGV4cGlyZXMpIHtcbiAgICAvLyBjYWxjdWxhdGUgdGhlIGV4cGlyYXRpb25cbiAgICBleHBpcmVzID0gaXNEZWZpbmVkQW5kTm90TnVsbChleHBpcmVzKSA/IGV4cGlyZXMgOiBuZXcgRGF0ZSgpLnZhbHVlT2YoKSArIFRXT19EQVlTOyAvLyBjcmVhdGUgdGhlIGVudHJ5XG5cbiAgICB2YXIgZW50cnkgPSB7XG4gICAgICBleHBpcmVzOiBleHBpcmVzLFxuICAgICAgaXRlbTogaXRlbVxuICAgIH07IC8vIHN0b3JlIHRoZSBpdGVtXG5cbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KGVudHJ5KSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGVyZSBpcyBhbiBlbnRyeSBmb3IgdGhpcyBrZXkuIFRoaXMgd2lsbCBub3QgY2hlY2sgdGhlIGV4cGlyYXRpb24uIElmXG4gICAqIHRoZSBlbnRyeSBpcyBleHBpcmVkLCBpdCB3aWxsIHJldHVybiBudWxsIG9uIGEgc3Vic2VxdWVudCBnZXRJdGVtIGludm9jYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBoYXNJdGVtOiBmdW5jdGlvbiBoYXNJdGVtKGtleSkge1xuICAgIHJldHVybiBnZXRFbnRyeShrZXkpICE9PSBudWxsO1xuICB9LFxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBpdGVtIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuIElmIGFuIGl0ZW0gd2l0aCB0aGlzIGtleSBkb2VzXG4gICAqIG5vdCBleGlzdCwgbnVsbCBpcyByZXR1cm5lZC4gSWYgYW4gaXRlbSBleGlzdHMgYnV0IGNhbm5vdCBiZSBwYXJzZWRcbiAgICogb3IgaXMgbWFsZm9ybWVkL3VucmVjb2duaXplZCwgbnVsbCBpcyByZXR1cm5lZC5cbiAgICpcbiAgICogQHBhcmFtIHt0eXBlfSBrZXlcbiAgICovXG4gIGdldEl0ZW06IGZ1bmN0aW9uIGdldEl0ZW0oa2V5KSB7XG4gICAgdmFyIGVudHJ5ID0gZ2V0RW50cnkoa2V5KTtcblxuICAgIGlmIChlbnRyeSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSAvLyBpZiB0aGUgZW50cnkgaXMgZXhwaXJlZCwgZHJvcCBpdCBhbmQgcmV0dXJuIG51bGxcblxuXG4gICAgaWYgKGNoZWNrRXhwaXJhdGlvbihlbnRyeSkpIHtcbiAgICAgIHRoaXMucmVtb3ZlSXRlbShrZXkpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSAvLyBpZiB0aGUgZW50cnkgaGFzIHRoZSBzcGVjaWZpZWQgZmllbGQgcmV0dXJuIGl0cyB2YWx1ZVxuXG5cbiAgICBpZiAoaXNEZWZpbmVkQW5kTm90TnVsbChlbnRyeVsnaXRlbSddKSkge1xuICAgICAgcmV0dXJuIGVudHJ5WydpdGVtJ107XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGV4cGlyYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgaXRlbS4gVGhpcyB3aWxsIG5vdCBjaGVjayB0aGUgZXhwaXJhdGlvbi4gSWZcbiAgICogdGhlIGVudHJ5IGlzIGV4cGlyZWQsIGl0IHdpbGwgcmV0dXJuIG51bGwgb24gYSBzdWJzZXF1ZW50IGdldEl0ZW0gaW52b2NhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgKiBAcmV0dXJucyB7aW50ZWdlcn1cbiAgICovXG4gIGdldEl0ZW1FeHBpcmF0aW9uOiBmdW5jdGlvbiBnZXRJdGVtRXhwaXJhdGlvbihrZXkpIHtcbiAgICB2YXIgZW50cnkgPSBnZXRFbnRyeShrZXkpO1xuXG4gICAgaWYgKGVudHJ5ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IC8vIGlmIHRoZSBlbnRyeSBoYXMgdGhlIHNwZWNpZmllZCBmaWVsZCByZXR1cm4gaXRzIHZhbHVlXG5cblxuICAgIGlmIChpc0RlZmluZWRBbmROb3ROdWxsKGVudHJ5WydleHBpcmVzJ10pKSB7XG4gICAgICByZXR1cm4gZW50cnlbJ2V4cGlyZXMnXTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfSxcblxuICAvKipcbiAgICogRXh0cmFjdHMgdGhlIHN1YmplY3QgZnJvbSB0aGUgc3BlY2lmaWVkIGp3dC4gSWYgdGhlIGp3dCBpcyBub3QgYXMgZXhwZWN0ZWRcbiAgICogYW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gand0XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBnZXRKd3RQYXlsb2FkOiBmdW5jdGlvbiBnZXRKd3RQYXlsb2FkKGp3dCkge1xuICAgIGlmIChpc0RlZmluZWRBbmROb3ROdWxsKGp3dCkpIHtcbiAgICAgIHZhciBzZWdtZW50cyA9IGp3dC5zcGxpdCgvXFwuLyk7XG5cbiAgICAgIGlmIChzZWdtZW50cy5sZW5ndGggIT09IDMpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmF3UGF5bG9hZCA9IHdpbmRvdy5hdG9iKHNlZ21lbnRzWzFdKTtcbiAgICAgIHZhciBwYXlsb2FkID0gSlNPTi5wYXJzZShyYXdQYXlsb2FkKTtcblxuICAgICAgaWYgKGlzRGVmaW5lZEFuZE5vdE51bGwocGF5bG9hZCkpIHtcbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBpdGVtIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuXG4gICAqXG4gICAqIEBwYXJhbSB7dHlwZX0ga2V5XG4gICAqL1xuICByZW1vdmVJdGVtOiBmdW5jdGlvbiByZW1vdmVJdGVtKGtleSkge1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XG4gIH1cbn07XG5GZHNTdG9yYWdlU2VydmljZS5wYXJhbWV0ZXJzID0gW107XG5leHBvcnQgZGVmYXVsdCBGZHNTdG9yYWdlU2VydmljZTsiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPCEtLVxcbkxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZVxcbmNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aFxcbnRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5cXG5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMFxcbih0aGUgXFxcIkxpY2Vuc2VcXFwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoXFxudGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcXG5cXG5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcXG5cXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXFxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXFxcIkFTIElTXFxcIiBCQVNJUyxcXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXFxuLS0+XFxuXFxuPGZkcy1kaWFsb2c+XFxuICAgIDxmZHMtZGlhbG9nLXRpdGxlICpuZ0lmPVxcXCJ0aXRsZVxcXCI+XFxuICAgICAgICA8ZGl2IGZ4TGF5b3V0PVxcXCJyb3dcXFwiIGZ4TGF5b3V0QWxpZ249XFxcInNwYWNlLWJldHdlZW4gY2VudGVyXFxcIj5cXG4gICAgICAgICAgICB7e3RpdGxlfX1cXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVxcXCJjYW5jZWwoKVxcXCI+XFxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjb2xvcj1cXFwicHJpbWFyeVxcXCI+Y2xvc2U8L21hdC1pY29uPlxcbiAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgPC9kaXY+XFxuICAgIDwvZmRzLWRpYWxvZy10aXRsZT5cXG4gICAgPGZkcy1kaWFsb2ctY29udGVudCBjbGFzcz1cXFwibWQtc3ViaGVhZCB0Yy1ncmV5LTcwMFxcXCI+XFxuICAgICAgICB7e21lc3NhZ2V9fVxcbiAgICA8L2Zkcy1kaWFsb2ctY29udGVudD5cXG4gICAgPGZkcy1kaWFsb2ctYWN0aW9ucz5cXG4gICAgICAgIDxidXR0b24gKm5nSWY9XFxcImNhbmNlbEJ1dHRvblxcXCIgbWF0LXJhaXNlZC1idXR0b25cXG4gICAgICAgICAgICAgICAgY29sb3I9XFxcInt7Y2FuY2VsQnV0dG9uQ29sb3J9fVxcXCJcXG4gICAgICAgICAgICAgICAgI2Nsb3NlQnRuXFxuICAgICAgICAgICAgICAgIChrZXlkb3duLmFycm93cmlnaHQpPVxcXCJhY2NlcHRCdG4uZm9jdXMoKVxcXCJcXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cXFwiY2FuY2VsKClcXFwiPnt7Y2FuY2VsQnV0dG9ufX1cXG4gICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgPGJ1dHRvbiAqbmdJZj1cXFwiYWNjZXB0QnV0dG9uXFxcIiBtYXQtcmFpc2VkLWJ1dHRvblxcbiAgICAgICAgICAgICAgICBjb2xvcj1cXFwie3thY2NlcHRCdXR0b25Db2xvcn19XFxcIlxcbiAgICAgICAgICAgICAgICAjYWNjZXB0QnRuXFxuICAgICAgICAgICAgICAgIChrZXlkb3duLmFycm93bGVmdCk9XFxcImNsb3NlQnRuLmZvY3VzKClcXFwiXFxuICAgICAgICAgICAgICAgIChjbGljayk9XFxcImFjY2VwdCgpXFxcIlxcbiAgICAgICAgICAgICAgICBjbGFzcz1cXFwicHVzaC1sZWZ0LXNtXFxcIj57e2FjY2VwdEJ1dHRvbn19XFxuICAgICAgICA8L2J1dHRvbj5cXG4gICAgPC9mZHMtZGlhbG9nLWFjdGlvbnM+XFxuPC9mZHMtZGlhbG9nPlwiOyIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmVcbiAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aFxuICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlxuICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjBcbiAqICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGhcbiAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuLyoqXG4gKiBGZHNDb25maXJtRGlhbG9nQ29tcG9uZW50IGNvbnN0cnVjdG9yLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICovXG5cbmZ1bmN0aW9uIEZkc0NvbmZpcm1EaWFsb2dDb21wb25lbnQoKSB7XG4gIHRoaXMudGl0bGUgPSAnJztcbiAgdGhpcy5tZXNzYWdlID0gJyc7XG4gIHRoaXMuYWNjZXB0QnV0dG9uID0gJyc7XG4gIHRoaXMuYWNjZXB0QnV0dG9uQ29sb3IgPSAnZmRzLXByaW1hcnknO1xuICB0aGlzLmNhbmNlbEJ1dHRvbiA9ICcnO1xuICB0aGlzLmNhbmNlbEJ1dHRvbkNvbG9yID0gJ2Zkcy1yZWd1bGFyJztcbiAgdGhpcy5kaWFsb2dSZWYgPSB1bmRlZmluZWQ7XG4gIHRoaXMudmlld0NvbnRhaW5lclJlZiA9IHVuZGVmaW5lZDtcbiAgdGhpcy5kaXNhYmxlQ2xvc2UgPSB0cnVlO1xufVxuXG5GZHNDb25maXJtRGlhbG9nQ29tcG9uZW50LnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IEZkc0NvbmZpcm1EaWFsb2dDb21wb25lbnQsXG5cbiAgLyoqXG4gICAqIENsb3NlIHRoZSBkaWFsb2cgYW5kIHNlbmQgYSBjYW5jZWwgcmVzcG9uc2UgdG8gYW55IHN1YnNjcmliZXJzLlxuICAgKi9cbiAgY2FuY2VsOiBmdW5jdGlvbiBjYW5jZWwoKSB7XG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoZmFsc2UpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBDbG9zZSB0aGUgZGlhbG9nIGFuZCBzZW5kIGFuIGFjY2VwdCByZXNwb25zZSB0byBhbnkgc3Vic2NyaWJlcnMuXG4gICAqL1xuICBhY2NlcHQ6IGZ1bmN0aW9uIGFjY2VwdCgpIHtcbiAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSh0cnVlKTtcbiAgfVxufTtcbkZkc0NvbmZpcm1EaWFsb2dDb21wb25lbnQuYW5ub3RhdGlvbnMgPSBbbmV3IENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZmRzLWNvbmZpcm0tZGlhbG9nJyxcbiAgdGVtcGxhdGU6IHJlcXVpcmUoJy4vY29uZmlybS1kaWFsb2cuY29tcG9uZW50Lmh0bWwnKX0pXTtcbkZkc0NvbmZpcm1EaWFsb2dDb21wb25lbnQucGFyYW1ldGVycyA9IFtdO1xuZXhwb3J0IHsgRmRzQ29uZmlybURpYWxvZ0NvbXBvbmVudCB9OyIsIm1vZHVsZS5leHBvcnRzID0gXCI8IS0tXFxuTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlXFxuY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoXFxudGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlxcblRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wXFxuKHRoZSBcXFwiTGljZW5zZVxcXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGhcXG50aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxcblxcbmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxcblxcblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcXFwiQVMgSVNcXFwiIEJBU0lTLFxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxcblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cXG4tLT5cXG5cXG48ZGl2IGNsYXNzPVxcXCJmZHMtZGlhbG9nLXdyYXBwZXJcXFwiPlxcbiAgICA8aDMgY2xhc3M9XFxcImZkcy1kaWFsb2ctdGl0bGUgbWQtdGl0bGVcXFwiICpuZ0lmPVxcXCJkaWFsb2dUaXRsZS5sZW5ndGggPiAwXFxcIj5cXG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cXFwiZmRzLWRpYWxvZy10aXRsZVxcXCI+PC9uZy1jb250ZW50PlxcbiAgICA8L2gzPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJmZHMtZGlhbG9nLWNvbnRlbnQgcGFkLWJvdHRvbS1tZFxcXCIgKm5nSWY9XFxcImRpYWxvZ0NvbnRlbnQubGVuZ3RoID4gMFxcXCI+XFxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XFxcImZkcy1kaWFsb2ctY29udGVudFxcXCI+PC9uZy1jb250ZW50PlxcbiAgICA8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiZmRzLWRpYWxvZy1hY3Rpb25zXFxcIiAqbmdJZj1cXFwiZGlhbG9nQWN0aW9ucy5sZW5ndGggPiAwXFxcIiBsYXlvdXQ9XFxcInJvd1xcXCI+XFxuICAgICAgICA8c3BhbiBmbGV4Pjwvc3Bhbj5cXG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cXFwiZmRzLWRpYWxvZy1hY3Rpb25zXFxcIj48L25nLWNvbnRlbnQ+XFxuICAgIDwvZGl2PlxcbjwvZGl2PlxcblwiOyIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmVcbiAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aFxuICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlxuICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjBcbiAqICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGhcbiAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IENvbXBvbmVudCwgQ29udGVudENoaWxkcmVuLCBEaXJlY3RpdmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiBGZHNEaWFsb2dUaXRsZURpcmVjdGl2ZSgpIHt9XG5GZHNEaWFsb2dUaXRsZURpcmVjdGl2ZS5wcm90b3R5cGUgPSB7XG4gIGNvbnRzdHJ1Y3RvcjogRmRzRGlhbG9nVGl0bGVEaXJlY3RpdmVcbn07XG5GZHNEaWFsb2dUaXRsZURpcmVjdGl2ZS5kZWNvcmF0b3JzID0gW3tcbiAgdHlwZTogRGlyZWN0aXZlLFxuICBhcmdzOiBbe1xuICAgIHNlbGVjdG9yOiAnZmRzLWRpYWxvZy10aXRsZSdcbiAgfV1cbn1dO1xuZXhwb3J0IGZ1bmN0aW9uIEZkc0RpYWxvZ0NvbnRlbnREaXJlY3RpdmUoKSB7fVxuRmRzRGlhbG9nQ29udGVudERpcmVjdGl2ZS5wcm90b3R5cGUgPSB7XG4gIGNvbnRzdHJ1Y3RvcjogRmRzRGlhbG9nQ29udGVudERpcmVjdGl2ZVxufTtcbkZkc0RpYWxvZ0NvbnRlbnREaXJlY3RpdmUuZGVjb3JhdG9ycyA9IFt7XG4gIHR5cGU6IERpcmVjdGl2ZSxcbiAgYXJnczogW3tcbiAgICBzZWxlY3RvcjogJ2Zkcy1kaWFsb2ctY29udGVudCdcbiAgfV1cbn1dO1xuZXhwb3J0IGZ1bmN0aW9uIEZkc0RpYWxvZ0FjdGlvbnNEaXJlY3RpdmUoKSB7fVxuRmRzRGlhbG9nQWN0aW9uc0RpcmVjdGl2ZS5wcm90b3R5cGUgPSB7XG4gIGNvbnRzdHJ1Y3RvcjogRmRzRGlhbG9nQWN0aW9uc0RpcmVjdGl2ZVxufTtcbkZkc0RpYWxvZ0FjdGlvbnNEaXJlY3RpdmUuZGVjb3JhdG9ycyA9IFt7XG4gIHR5cGU6IERpcmVjdGl2ZSxcbiAgYXJnczogW3tcbiAgICBzZWxlY3RvcjogJ2Zkcy1kaWFsb2ctYWN0aW9ucydcbiAgfV1cbn1dO1xuLyoqXG4gKiBGZHNEaWFsb2dDb21wb25lbnQgY29uc3RydWN0b3JcbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuXG5mdW5jdGlvbiBGZHNEaWFsb2dDb21wb25lbnQoKSB7XG4gIHRoaXMuZGlhbG9nVGl0bGUgPSAnJztcbiAgdGhpcy5kaWFsb2dDb250ZW50ID0gJyc7XG4gIHRoaXMuZGlhbG9nQWN0aW9ucyA9ICcnO1xufVxuXG5GZHNEaWFsb2dDb21wb25lbnQucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogRmRzRGlhbG9nQ29tcG9uZW50LFxuXG4gIC8qKlxuICAgKiBSZXNwb25kIGFmdGVyIEFuZ3VsYXIgcHJvamVjdHMgZXh0ZXJuYWwgY29udGVudCBpbnRvIHRoZSBjb21wb25lbnQncyB2aWV3LlxuICAgKi9cbiAgbmdBZnRlckNvbnRlbnRJbml0OiBmdW5jdGlvbiBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgaWYgKHRoaXMuZGlhbG9nVGl0bGUubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEdXBsaWNhdGUgZmRzLWRpYWxvZy10aXRsZSBjb21wb25lbnQgYXQgaW4gZmRzLWRpYWxvZy4nKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kaWFsb2dDb250ZW50Lmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRHVwbGljYXRlIGZkcy1kaWFsb2ctY29udGVudCBjb21wb25lbnQgYXQgaW4gZmRzLWRpYWxvZy4nKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kaWFsb2dBY3Rpb25zLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRHVwbGljYXRlIGZkcy1kaWFsb2ctYWN0aW9ucyBjb21wb25lbnQgYXQgaW4gZmRzLWRpYWxvZy4nKTtcbiAgICB9XG4gIH1cbn07XG5GZHNEaWFsb2dDb21wb25lbnQuYW5ub3RhdGlvbnMgPSBbbmV3IENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZmRzLWRpYWxvZycsXG4gIHRlbXBsYXRlOiByZXF1aXJlKCcuL2Zkcy1kaWFsb2cuY29tcG9uZW50Lmh0bWwnKSxcbiAgcXVlcmllczoge1xuICAgIGRpYWxvZ1RpdGxlOiBuZXcgQ29udGVudENoaWxkcmVuKEZkc0RpYWxvZ1RpdGxlRGlyZWN0aXZlKSxcbiAgICBkaWFsb2dDb250ZW50OiBuZXcgQ29udGVudENoaWxkcmVuKEZkc0RpYWxvZ0NvbnRlbnREaXJlY3RpdmUpLFxuICAgIGRpYWxvZ0FjdGlvbnM6IG5ldyBDb250ZW50Q2hpbGRyZW4oRmRzRGlhbG9nQWN0aW9uc0RpcmVjdGl2ZSlcbiAgfVxufSldO1xuRmRzRGlhbG9nQ29tcG9uZW50LnBhcmFtZXRlcnMgPSBbXTtcbmV4cG9ydCB7IEZkc0RpYWxvZ0NvbXBvbmVudCB9OyIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmVcbiAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aFxuICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlxuICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjBcbiAqICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGhcbiAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGbGV4TGF5b3V0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZmxleC1sYXlvdXQnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSwgTWF0SWNvbk1vZHVsZSwgTWF0SW5wdXRNb2R1bGUsIE1hdERpYWxvZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRmRzRGlhbG9nVGl0bGVEaXJlY3RpdmUsIEZkc0RpYWxvZ0NvbnRlbnREaXJlY3RpdmUsIEZkc0RpYWxvZ0FjdGlvbnNEaXJlY3RpdmUsIEZkc0RpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4vZmRzLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgSUNvbmZpcm1Db25maWcsIEZkc0RpYWxvZ1NlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2RpYWxvZy5zZXJ2aWNlJztcbmltcG9ydCB7IEZkc0NvbmZpcm1EaWFsb2dDb21wb25lbnQgfSBmcm9tICcuL2NvbmZpcm0tZGlhbG9nL2NvbmZpcm0tZGlhbG9nLmNvbXBvbmVudCc7XG52YXIgRkRTX0RJQUxPR1MgPSBbRmRzRGlhbG9nQ29tcG9uZW50LCBGZHNEaWFsb2dUaXRsZURpcmVjdGl2ZSwgRmRzRGlhbG9nQWN0aW9uc0RpcmVjdGl2ZSwgRmRzRGlhbG9nQ29udGVudERpcmVjdGl2ZSwgRmRzQ29uZmlybURpYWxvZ0NvbXBvbmVudF07XG52YXIgRkRTX0RJQUxPR1NfRU5UUllfQ09NUE9ORU5UUyA9IFtGZHNDb25maXJtRGlhbG9nQ29tcG9uZW50XTtcbi8qKlxuICogRmRzRGlhbG9nc01vZHVsZSBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuXG5mdW5jdGlvbiBGZHNEaWFsb2dzTW9kdWxlKCkge31cblxuRmRzRGlhbG9nc01vZHVsZS5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBGZHNEaWFsb2dzTW9kdWxlXG59O1xuRmRzRGlhbG9nc01vZHVsZS5hbm5vdGF0aW9ucyA9IFtuZXcgTmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbRmxleExheW91dE1vZHVsZSwgRm9ybXNNb2R1bGUsIENvbW1vbk1vZHVsZSwgTWF0RGlhbG9nTW9kdWxlLCBNYXRJbnB1dE1vZHVsZSwgTWF0QnV0dG9uTW9kdWxlLCBNYXRJY29uTW9kdWxlXSxcbiAgZGVjbGFyYXRpb25zOiBbRkRTX0RJQUxPR1NdLFxuICBleHBvcnRzOiBbRkRTX0RJQUxPR1NdLFxuICBwcm92aWRlcnM6IFtGZHNEaWFsb2dTZXJ2aWNlXSxcbiAgZW50cnlDb21wb25lbnRzOiBbRkRTX0RJQUxPR1NfRU5UUllfQ09NUE9ORU5UU11cbn0pXTtcbmV4cG9ydCB7IEZkc0RpYWxvZ3NNb2R1bGUsIElDb25maXJtQ29uZmlnLCBGZHNEaWFsb2dTZXJ2aWNlLCBGZHNEaWFsb2dDb21wb25lbnQsIEZkc0RpYWxvZ1RpdGxlRGlyZWN0aXZlLCBGZHNEaWFsb2dDb250ZW50RGlyZWN0aXZlLCBGZHNEaWFsb2dBY3Rpb25zRGlyZWN0aXZlLCBGZHNDb25maXJtRGlhbG9nQ29tcG9uZW50IH07IiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZVxuICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoXG4gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuXG4gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMFxuICogKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aFxuICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCB7IE1hdERpYWxvZ0NvbmZpZywgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgRmRzQ29uZmlybURpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uL2NvbmZpcm0tZGlhbG9nL2NvbmZpcm0tZGlhbG9nLmNvbXBvbmVudCc7XG5cbmZ1bmN0aW9uIElEaWFsb2dDb25maWcoKSB7XG4gIHRoaXMudGl0bGUgPSAnJztcbiAgdGhpcy5tZXNzYWdlID0gJyc7XG4gIHRoaXMuZGlhbG9nUmVmID0gdW5kZWZpbmVkO1xuICB0aGlzLnZpZXdDb250YWluZXJSZWYgPSB1bmRlZmluZWQ7XG4gIHRoaXMuZGlzYWJsZUNsb3NlID0gdHJ1ZTtcbn1cblxuSURpYWxvZ0NvbmZpZy5wcm90b3R5cGUgPSB7XG4gIGNvbnRzdHJ1Y3RvcjogSURpYWxvZ0NvbmZpZ1xufTtcbiQuZXh0ZW5kKElEaWFsb2dDb25maWcsIE1hdERpYWxvZ0NvbmZpZyk7XG5cbmZ1bmN0aW9uIElDb25maXJtQ29uZmlnKCkge1xuICB0aGlzLmFjY2VwdEJ1dHRvbiA9ICdBQ0NFUFQnO1xuICB0aGlzLmFjY2VwdEJ1dHRvbkNvbG9yID0gJ2Zkcy1wcmltYXJ5JztcbiAgdGhpcy5jYW5jZWxCdXR0b24gPSAnQ0FOQ0VMJztcbiAgdGhpcy5jYW5jZWxCdXR0b25Db2xvciA9ICdmZHMtc2Vjb25kYXJ5Jztcbn1cblxuSUNvbmZpcm1Db25maWcucHJvdG90eXBlID0ge1xuICBjb250c3RydWN0b3I6IElDb25maXJtQ29uZmlnXG59O1xuJC5leHRlbmQoSUNvbmZpcm1Db25maWcsIElEaWFsb2dDb25maWcpO1xuXG5mdW5jdGlvbiBjcmVhdGVDb25maWcoY29uZmlnKSB7XG4gIHZhciBkaWFsb2dDb25maWcgPSBuZXcgSUNvbmZpcm1Db25maWcoKTtcbiAgZGlhbG9nQ29uZmlnLnZpZXdDb250YWluZXJSZWYgPSBjb25maWcudmlld0NvbnRhaW5lclJlZjtcbiAgZGlhbG9nQ29uZmlnLmRpc2FibGVDbG9zZSA9IGNvbmZpZy5kaXNhYmxlQ2xvc2U7XG4gIHJldHVybiBkaWFsb2dDb25maWc7XG59XG4vKipcbiAqIEZkc0RpYWxvZ1NlcnZpY2UgY29uc3RydWN0b3IuXG4gKlxuICogQHBhcmFtIE1hdERpYWxvZyAgICAgIFRoZSBhbmd1bGFyIG1hdGVyaWFsIE1hdERpYWxvZy5cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5cblxuZnVuY3Rpb24gRmRzRGlhbG9nU2VydmljZShNYXREaWFsb2cpIHtcbiAgdGhpcy5kaWFsb2dTZXJ2aWNlID0gTWF0RGlhbG9nO1xufVxuXG5GZHNEaWFsb2dTZXJ2aWNlLnByb3RvdHlwZSA9IHtcbiAgY29udHN0cnVjdG9yOiBGZHNEaWFsb2dTZXJ2aWNlLFxuXG4gIC8qKlxuICAgKiBXcmFwcGVyIGZ1bmN0aW9uIG92ZXIgdGhlIG9wZW4oKSBtZXRob2QgaW4gTWF0RGlhbG9nLlxuICAgKiBPcGVucyBhIG1vZGFsIGRpYWxvZyBjb250YWluaW5nIHRoZSBnaXZlbiBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBjb21wb25lbnQgICAgIFRoZSBhbmd1bGFyIENvbXBvbmVudFR5cGU8VD4uXG4gICAqIEBwYXJhbSBjb25maWcgICAgICAgIFRoZSBhbmd1bGFyIG1hdGVyaWFsIE1hdERpYWxvZ0NvbmZpZy5cbiAgICpcbiAgICogQHJldHVybnMge01hdERpYWxvUmVmfSAgICBUaGUgcmVmZXJlbmNlIHRvIHRoZSBkaWFsb2cuXG4gICAqL1xuICBvcGVuOiBmdW5jdGlvbiBvcGVuKGNvbXBvbmVudCwgY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKGNvbXBvbmVudCwgY29uZmlnKTtcbiAgfSxcblxuICAvKipcbiAgICogV3JhcHBlciBmdW5jdGlvbiBvdmVyIHRoZSBjbG9zZUFsbCgpIG1ldGhvZCBpbiBNYXREaWFsb2cuXG4gICAqIENsb3NlcyBhbGwgb2YgdGhlIGN1cnJlbnRseS1vcGVuIGRpYWxvZ3MuXG4gICAqL1xuICBjbG9zZUFsbDogZnVuY3Rpb24gY2xvc2VBbGwoKSB7XG4gICAgdGhpcy5kaWFsb2dTZXJ2aWNlLmNsb3NlQWxsKCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIE9wZW5zIGEgY29uZmlybSBkaWFsb2cgd2l0aCB0aGUgcHJvdmlkZWQgY29uZmlnLlxuICAgKlxuICAgKiBAcGFyYW0gY29uZmlnICAgICBJQ29uZmlybUNvbmZpZyB7XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPzogc3RyaW5nO1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU/OiBzdHJpbmc7XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFsb2dSZWY/OiBNYXREaWFsb1JlZjtcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdDb250YWluZXJSZWY/OiBWaWV3Q29udGFpbmVyUmVmO1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZUNsb3NlPzogYm9vbGVhbjtcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VwdEJ1dHRvbj86IHN0cmluZztcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VwdEJ1dHRvbkNvbG9yPzogc3RyaW5nO1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uPzogc3RyaW5nO1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uQ29sb3I/OiBzdHJpbmc7XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAqXG4gICAqIEByZXR1cm5zIHtNYXREaWFsb1JlZn0gICAgVGhlIHJlZmVyZW5jZSB0byB0aGUgZGlhbG9nLlxuICAgKi9cbiAgb3BlbkNvbmZpcm06IGZ1bmN0aW9uIG9wZW5Db25maXJtKGNvbmZpZykge1xuICAgIHZhciBkaWFsb2dDb25maWcgPSBjcmVhdGVDb25maWcoY29uZmlnKTtcbiAgICB2YXIgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW4oRmRzQ29uZmlybURpYWxvZ0NvbXBvbmVudCwgZGlhbG9nQ29uZmlnKTtcbiAgICB2YXIgY29uZmlybURpYWxvZ0NvbXBvbmVudCA9IGRpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZTtcbiAgICBjb25maXJtRGlhbG9nQ29tcG9uZW50LmRpYWxvZ1JlZiA9IGRpYWxvZ1JlZjtcblxuICAgIGlmIChjb25maWcudGl0bGUpIHtcbiAgICAgIGNvbmZpcm1EaWFsb2dDb21wb25lbnQudGl0bGUgPSBjb25maWcudGl0bGU7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5tZXNzYWdlKSB7XG4gICAgICBjb25maXJtRGlhbG9nQ29tcG9uZW50Lm1lc3NhZ2UgPSBjb25maWcubWVzc2FnZTtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmFjY2VwdEJ1dHRvbikge1xuICAgICAgY29uZmlybURpYWxvZ0NvbXBvbmVudC5hY2NlcHRCdXR0b24gPSBjb25maWcuYWNjZXB0QnV0dG9uO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuYWNjZXB0QnV0dG9uQ29sb3IpIHtcbiAgICAgIGNvbmZpcm1EaWFsb2dDb21wb25lbnQuYWNjZXB0QnV0dG9uQ29sb3IgPSBjb25maWcuYWNjZXB0QnV0dG9uQ29sb3I7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5jYW5jZWxCdXR0b24pIHtcbiAgICAgIGNvbmZpcm1EaWFsb2dDb21wb25lbnQuY2FuY2VsQnV0dG9uID0gY29uZmlnLmNhbmNlbEJ1dHRvbjtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmNhbmNlbEJ1dHRvbkNvbG9yKSB7XG4gICAgICBjb25maXJtRGlhbG9nQ29tcG9uZW50LmNhbmNlbEJ1dHRvbkNvbG9yID0gY29uZmlnLmNhbmNlbEJ1dHRvbkNvbG9yO1xuICAgIH1cblxuICAgIHJldHVybiBkaWFsb2dSZWY7XG4gIH1cbn07XG5GZHNEaWFsb2dTZXJ2aWNlLnBhcmFtZXRlcnMgPSBbTWF0RGlhbG9nXTtcbmV4cG9ydCB7IElEaWFsb2dDb25maWcsIElDb25maXJtQ29uZmlnLCBGZHNEaWFsb2dTZXJ2aWNlIH07IiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZVxuICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoXG4gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuXG4gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMFxuICogKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aFxuICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGbGV4TGF5b3V0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZmxleC1sYXlvdXQnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1hdEF1dG9jb21wbGV0ZU1vZHVsZSwgTWF0QnV0dG9uTW9kdWxlLCBNYXRCdXR0b25Ub2dnbGVNb2R1bGUsIE1hdENhcmRNb2R1bGUsIE1hdENoZWNrYm94TW9kdWxlLCBNYXRDaGlwc01vZHVsZSwgTWF0RGF0ZXBpY2tlck1vZHVsZSwgTWF0RGlhbG9nTW9kdWxlLCBNYXRFeHBhbnNpb25Nb2R1bGUsIE1hdEZvcm1GaWVsZE1vZHVsZSwgTWF0R3JpZExpc3RNb2R1bGUsIE1hdEljb25Nb2R1bGUsIE1hdElucHV0TW9kdWxlLCBNYXRMaXN0TW9kdWxlLCBNYXRNZW51TW9kdWxlLCBNYXRQcm9ncmVzc0Jhck1vZHVsZSwgTWF0UHJvZ3Jlc3NTcGlubmVyTW9kdWxlLCBNYXRSYWRpb01vZHVsZSwgTWF0U2VsZWN0TW9kdWxlLCBNYXRTbGlkZVRvZ2dsZU1vZHVsZSwgTWF0U2xpZGVyTW9kdWxlLCBNYXRTaWRlbmF2TW9kdWxlLCBNYXRTbmFja0Jhck1vZHVsZSwgTWF0U3RlcHBlck1vZHVsZSwgTWF0VGFic01vZHVsZSwgTWF0VG9vbGJhck1vZHVsZSwgTWF0VG9vbHRpcE1vZHVsZSwgTWF0UGFnaW5hdG9yTW9kdWxlLCBNYXRTb3J0TW9kdWxlLCBNYXRUYWJsZU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsJztcbmltcG9ydCB7IEJyb3dzZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IEJyb3dzZXJBbmltYXRpb25zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlci9hbmltYXRpb25zJztcbmltcG9ydCB7IENvdmFsZW50Q29tbW9uTW9kdWxlLCBDb3ZhbGVudENoaXBzTW9kdWxlLCBDb3ZhbGVudERpYWxvZ3NNb2R1bGUsIENvdmFsZW50RXhwYW5zaW9uUGFuZWxNb2R1bGUsIENvdmFsZW50UGFnaW5nTW9kdWxlIH0gZnJvbSAnQGNvdmFsZW50L2NvcmUnO1xuaW1wb3J0IHsgQ292YWxlbnRTdGVwc01vZHVsZSB9IGZyb20gJ0Bjb3ZhbGVudC9jb3JlL3N0ZXBzJztcbmltcG9ydCB7IENvdmFsZW50RGF0YVRhYmxlTW9kdWxlIH0gZnJvbSAnQGNvdmFsZW50L2NvcmUvZGF0YS10YWJsZSc7XG5pbXBvcnQgeyBGZHNEaWFsb2dzTW9kdWxlIH0gZnJvbSAnLi9kaWFsb2dzL2Zkcy1kaWFsb2dzLm1vZHVsZSc7XG5pbXBvcnQgeyBGZHNTbmFja0JhcnNNb2R1bGUgfSBmcm9tICcuL3NuYWNrYmFycy9mZHMtc25hY2tiYXJzLm1vZHVsZSc7XG4vKipcbiAqIEZsb3dEZXNpZ25TeXN0ZW1Nb2R1bGUgY29uc3RydWN0b3IuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKi9cblxuZnVuY3Rpb24gRmxvd0Rlc2lnblN5c3RlbU1vZHVsZSgpIHtcbiAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24gKCkge1xuICAgIC8vYWRkIGZkcyBhdHRyIHRvIGJvZHkgdGFnIHRvIGFsbG93IGZpbmUgZ3JhaW4gc3R5bGUgb3ZlcnJpZGVzXG4gICAgZG9jdW1lbnQuYm9keS5zZXRBdHRyaWJ1dGUoJ2ZkcycsICcnKTsgLy9vdmVycmlkZSB0aGUgaG92ZXIgc3R5bGVzIGZvciBjaGVja2JveCBib3JkZXJzXG5cbiAgICAkKGRvY3VtZW50LmJvZHkpLm9uKCdtb3VzZWVudGVyJywgJy5tYXQtY2hlY2tib3gtaW5uZXItY29udGFpbmVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgJCh0aGlzKS5maW5kKCcubWF0LWNoZWNrYm94LWZyYW1lJykuY3NzKCdib3JkZXItY29sb3InLCAnIzE0OTFDMScpO1xuICAgIH0pO1xuICAgICQoZG9jdW1lbnQuYm9keSkub24oJ21vdXNlbGVhdmUnLCAnLm1hdC1jaGVja2JveC1pbm5lci1jb250YWluZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAkKHRoaXMpLmZpbmQoJy5tYXQtY2hlY2tib3gtZnJhbWUnKS5jc3MoJ2JvcmRlci1jb2xvcicsICcjREREREREJyk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5GbG93RGVzaWduU3lzdGVtTW9kdWxlLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IEZsb3dEZXNpZ25TeXN0ZW1Nb2R1bGVcbn07XG5GbG93RGVzaWduU3lzdGVtTW9kdWxlLmFubm90YXRpb25zID0gW25ldyBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtGbGV4TGF5b3V0TW9kdWxlLCBCcm93c2VyQW5pbWF0aW9uc01vZHVsZSwgQ29tbW9uTW9kdWxlLCBCcm93c2VyTW9kdWxlLCBNYXRBdXRvY29tcGxldGVNb2R1bGUsIE1hdEJ1dHRvbk1vZHVsZSwgTWF0QnV0dG9uVG9nZ2xlTW9kdWxlLCBNYXRDYXJkTW9kdWxlLCBNYXRDaGVja2JveE1vZHVsZSwgTWF0Q2hpcHNNb2R1bGUsIE1hdERhdGVwaWNrZXJNb2R1bGUsIE1hdERpYWxvZ01vZHVsZSwgTWF0RXhwYW5zaW9uTW9kdWxlLCBNYXRGb3JtRmllbGRNb2R1bGUsIE1hdEdyaWRMaXN0TW9kdWxlLCBNYXRJY29uTW9kdWxlLCBNYXRJbnB1dE1vZHVsZSwgTWF0TGlzdE1vZHVsZSwgTWF0TWVudU1vZHVsZSwgTWF0UHJvZ3Jlc3NCYXJNb2R1bGUsIE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSwgTWF0UmFkaW9Nb2R1bGUsIE1hdFNlbGVjdE1vZHVsZSwgTWF0U2xpZGVUb2dnbGVNb2R1bGUsIE1hdFNsaWRlck1vZHVsZSwgTWF0U2lkZW5hdk1vZHVsZSwgTWF0U25hY2tCYXJNb2R1bGUsIE1hdFN0ZXBwZXJNb2R1bGUsIE1hdFRhYnNNb2R1bGUsIE1hdFRvb2xiYXJNb2R1bGUsIE1hdFRvb2x0aXBNb2R1bGUsIE1hdFBhZ2luYXRvck1vZHVsZSwgTWF0U29ydE1vZHVsZSwgTWF0VGFibGVNb2R1bGUsIENvdmFsZW50Q29tbW9uTW9kdWxlLCBDb3ZhbGVudENoaXBzTW9kdWxlLCBDb3ZhbGVudFN0ZXBzTW9kdWxlLCBDb3ZhbGVudERhdGFUYWJsZU1vZHVsZSwgQ292YWxlbnREaWFsb2dzTW9kdWxlLCBDb3ZhbGVudEV4cGFuc2lvblBhbmVsTW9kdWxlLCBDb3ZhbGVudFBhZ2luZ01vZHVsZSwgRmRzRGlhbG9nc01vZHVsZSwgRmRzU25hY2tCYXJzTW9kdWxlXSxcbiAgZXhwb3J0czogW0ZsZXhMYXlvdXRNb2R1bGUsIEJyb3dzZXJBbmltYXRpb25zTW9kdWxlLCBDb21tb25Nb2R1bGUsIEJyb3dzZXJNb2R1bGUsIE1hdEF1dG9jb21wbGV0ZU1vZHVsZSwgTWF0QnV0dG9uTW9kdWxlLCBNYXRCdXR0b25Ub2dnbGVNb2R1bGUsIE1hdENhcmRNb2R1bGUsIE1hdENoZWNrYm94TW9kdWxlLCBNYXRDaGlwc01vZHVsZSwgTWF0RGF0ZXBpY2tlck1vZHVsZSwgTWF0RGlhbG9nTW9kdWxlLCBNYXRFeHBhbnNpb25Nb2R1bGUsIE1hdEZvcm1GaWVsZE1vZHVsZSwgTWF0R3JpZExpc3RNb2R1bGUsIE1hdEljb25Nb2R1bGUsIE1hdElucHV0TW9kdWxlLCBNYXRMaXN0TW9kdWxlLCBNYXRNZW51TW9kdWxlLCBNYXRQcm9ncmVzc0Jhck1vZHVsZSwgTWF0UHJvZ3Jlc3NTcGlubmVyTW9kdWxlLCBNYXRSYWRpb01vZHVsZSwgTWF0U2VsZWN0TW9kdWxlLCBNYXRTbGlkZVRvZ2dsZU1vZHVsZSwgTWF0U2xpZGVyTW9kdWxlLCBNYXRTaWRlbmF2TW9kdWxlLCBNYXRTbmFja0Jhck1vZHVsZSwgTWF0U3RlcHBlck1vZHVsZSwgTWF0VGFic01vZHVsZSwgTWF0VG9vbGJhck1vZHVsZSwgTWF0VG9vbHRpcE1vZHVsZSwgTWF0UGFnaW5hdG9yTW9kdWxlLCBNYXRTb3J0TW9kdWxlLCBNYXRUYWJsZU1vZHVsZSwgQ292YWxlbnRDb21tb25Nb2R1bGUsIENvdmFsZW50Q2hpcHNNb2R1bGUsIENvdmFsZW50U3RlcHNNb2R1bGUsIENvdmFsZW50RGF0YVRhYmxlTW9kdWxlLCBDb3ZhbGVudERpYWxvZ3NNb2R1bGUsIENvdmFsZW50RXhwYW5zaW9uUGFuZWxNb2R1bGUsIENvdmFsZW50UGFnaW5nTW9kdWxlLCBGZHNEaWFsb2dzTW9kdWxlLCBGZHNTbmFja0JhcnNNb2R1bGVdXG59KV07XG5leHBvcnQgZGVmYXVsdCBGbG93RGVzaWduU3lzdGVtTW9kdWxlOyIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmVcbiAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aFxuICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlxuICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjBcbiAqICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGhcbiAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IEZkc0RpYWxvZ3NNb2R1bGUsIEZkc0NvbmZpcm1EaWFsb2dDb21wb25lbnQsIEZkc0RpYWxvZ0FjdGlvbnNEaXJlY3RpdmUsIEZkc0RpYWxvZ0NvbXBvbmVudCwgRmRzRGlhbG9nQ29udGVudERpcmVjdGl2ZSwgRmRzRGlhbG9nU2VydmljZSwgRmRzRGlhbG9nVGl0bGVEaXJlY3RpdmUsIElDb25maXJtQ29uZmlnIH0gZnJvbSAnLi9kaWFsb2dzL2Zkcy1kaWFsb2dzLm1vZHVsZSc7XG5pbXBvcnQgeyBGZHNDb21tb25zTW9kdWxlLCBGZHNTdG9yYWdlU2VydmljZSB9IGZyb20gJy4vY29tbW9uL2Zkcy1jb21tb24ubW9kdWxlJztcbmltcG9ydCBGZHNBbmltYXRpb25zIGZyb20gJy4vY29tbW9uL2Zkcy5hbmltYXRpb25zJztcbmltcG9ydCB7IEZkc0NvYXN0ZXJDb21wb25lbnQsIEZkc1NuYWNrQmFyQWN0aW9uc0RpcmVjdGl2ZSwgRmRzU25hY2tCYXJDb21wb25lbnQsIEZkc1NuYWNrQmFyQ29udGVudERpcmVjdGl2ZSwgRmRzU25hY2tCYXJTZXJ2aWNlLCBGZHNTbmFja0JhcnNNb2R1bGUsIEZkc1NuYWNrQmFyVGl0bGVEaXJlY3RpdmUsIElDb2FzdGVyQ29uZmlnIH0gZnJvbSAnLi9zbmFja2JhcnMvZmRzLXNuYWNrYmFycy5tb2R1bGUnO1xuaW1wb3J0IEZsb3dEZXNpZ25TeXN0ZW1Nb2R1bGUgZnJvbSAnLi9mbG93LWRlc2lnbi1zeXN0ZW0ubW9kdWxlJztcbmV4cG9ydCB7IEZkc0RpYWxvZ3NNb2R1bGUsIEZkc0NvbmZpcm1EaWFsb2dDb21wb25lbnQsIEZkc0RpYWxvZ0FjdGlvbnNEaXJlY3RpdmUsIEZkc0RpYWxvZ0NvbXBvbmVudCwgRmRzRGlhbG9nQ29udGVudERpcmVjdGl2ZSwgRmRzRGlhbG9nU2VydmljZSwgRmRzRGlhbG9nVGl0bGVEaXJlY3RpdmUsIElDb25maXJtQ29uZmlnLCBGZHNDb21tb25zTW9kdWxlLCBGZHNTdG9yYWdlU2VydmljZSwgRmRzQW5pbWF0aW9ucywgRmRzQ29hc3RlckNvbXBvbmVudCwgRmRzU25hY2tCYXJBY3Rpb25zRGlyZWN0aXZlLCBGZHNTbmFja0JhckNvbXBvbmVudCwgRmRzU25hY2tCYXJDb250ZW50RGlyZWN0aXZlLCBGZHNTbmFja0JhclNlcnZpY2UsIEZkc1NuYWNrQmFyc01vZHVsZSwgRmRzU25hY2tCYXJUaXRsZURpcmVjdGl2ZSwgSUNvYXN0ZXJDb25maWcsIEZsb3dEZXNpZ25TeXN0ZW1Nb2R1bGUgYXMgRmRzQ29yZU1vZHVsZSB9OyIsIm1vZHVsZS5leHBvcnRzID0gXCI8IS0tXFxuTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlXFxuY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoXFxudGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlxcblRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wXFxuKHRoZSBcXFwiTGljZW5zZVxcXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGhcXG50aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxcblxcbmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxcblxcblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcXFwiQVMgSVNcXFwiIEJBU0lTLFxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxcblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cXG4tLT5cXG5cXG48ZmRzLXNuYWNrYmFyPlxcbiAgICA8ZmRzLXNuYWNrYmFyLXRpdGxlICpuZ0lmPVxcXCJ0aXRsZVxcXCI+XFxuICAgICAgICA8YnV0dG9uIGNsYXNzPVxcXCJjb2FzdGVyLWNsb3NlLWljb25cXFwiIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVxcXCJjYW5jZWwoKVxcXCI+XFxuICAgICAgICAgICAgPG1hdC1pY29uIGNvbG9yPVxcXCJwcmltYXJ5XFxcIj5jbG9zZTwvbWF0LWljb24+XFxuICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgIDxpICpuZ0lmPVxcXCJpY29uXFxcIiBjbGFzcz1cXFwie3tpY29ufX0gZmRzLWNvYXN0ZXItaWNvblxcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiPjwvaT5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImVsbGlwc2lzXFxcIiBmeExheW91dD1cXFwicm93XFxcIiB0aXRsZT1cXFwie3t0aXRsZX19XFxcIiBmeExheW91dEFsaWduPVxcXCJzcGFjZS1iZXR3ZWVuIGNlbnRlclxcXCI+XFxuICAgICAgICAgICAge3t0aXRsZX19XFxuICAgICAgICA8L2Rpdj5cXG4gICAgPC9mZHMtc25hY2tiYXItdGl0bGU+XFxuICAgIDxmZHMtc25hY2tiYXItY29udGVudCB0aXRsZT1cXFwie3ttZXNzYWdlfX1cXFwiIGNsYXNzPVxcXCJmZHMtY29hc3Rlci1tZXNzYWdlIHRjLWdyZXktNzAwXFxcIj5cXG4gICAgICAgIHt7bWVzc2FnZX19XFxuICAgIDwvZmRzLXNuYWNrYmFyLWNvbnRlbnQ+XFxuICAgIDxmZHMtc25hY2tiYXItYWN0aW9ucz5cXG4gICAgPC9mZHMtc25hY2tiYXItYWN0aW9ucz5cXG48L2Zkcy1zbmFja2Jhcj5cXG5cIjsiLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlXG4gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGhcbiAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5cbiAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wXG4gKiAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoXG4gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG4vKipcbiAqIEZkc0NvYXN0ZXJDb21wb25lbnQgY29uc3RydWN0b3IuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKi9cblxuZnVuY3Rpb24gRmRzQ29hc3RlckNvbXBvbmVudCgpIHtcbiAgdGhpcy50aXRsZSA9ICcnO1xuICB0aGlzLm1lc3NhZ2UgPSAnJztcbiAgdGhpcy5pY29uID0gJyc7XG4gIHRoaXMuY29sb3IgPSAnJztcbiAgdGhpcy5zbmFja0JhclJlZiA9IHVuZGVmaW5lZDtcbiAgdGhpcy52aWV3Q29udGFpbmVyUmVmID0gdW5kZWZpbmVkO1xufVxuXG5GZHNDb2FzdGVyQ29tcG9uZW50LnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IEZkc0NvYXN0ZXJDb21wb25lbnQsXG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIGNvbXBvbmVudC5cbiAgICovXG4gIG5nQWZ0ZXJWaWV3Q2hlY2tlZDogZnVuY3Rpb24gbmdBZnRlclZpZXdDaGVja2VkKCkge1xuICAgICQoJy5mZHMtc25hY2tiYXItd3JhcHBlcicpLmNzcygnYm9yZGVyLWNvbG9yJywgdGhpcy5jb2xvcik7XG4gICAgJCgnLmZkcy1zbmFja2Jhci10aXRsZScpLmNzcygnY29sb3InLCB0aGlzLmNvbG9yKTtcbiAgICAkKCcuZmRzLWNvYXN0ZXItaWNvbicpLmNzcygnY29sb3InLCB0aGlzLmNvbG9yKTtcblxuICAgIGlmICh0aGlzLmljb24pIHtcbiAgICAgICQoJy5mZHMtc25hY2tiYXItd3JhcHBlcicpLmNzcygncGFkZGluZycsICcxNXB4IDE1cHggMTVweCA0NXB4Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICQoJy5mZHMtc25hY2tiYXItd3JhcHBlcicpLmNzcygncGFkZGluZycsICcxNXB4IDE1cHggMTVweCAxNXB4Jyk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBDbG9zZSB0aGUgc25hY2tiYXIgYW5kIHNlbmQgYSBjYW5jZWwgcmVzcG9uc2UgdG8gYW55IHN1YnNjcmliZXJzLlxuICAgKi9cbiAgY2FuY2VsOiBmdW5jdGlvbiBjYW5jZWwoKSB7XG4gICAgdGhpcy5zbmFja0JhclJlZi5kaXNtaXNzKGZhbHNlKTtcbiAgfVxufTtcbkZkc0NvYXN0ZXJDb21wb25lbnQuYW5ub3RhdGlvbnMgPSBbbmV3IENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZmRzLWNvYXN0ZXInLFxuICB0ZW1wbGF0ZTogcmVxdWlyZSgnLi9jb2FzdGVyLmNvbXBvbmVudC5odG1sJyl9KV07XG5GZHNDb2FzdGVyQ29tcG9uZW50LnBhcmFtZXRlcnMgPSBbXTtcbmV4cG9ydCB7IEZkc0NvYXN0ZXJDb21wb25lbnQgfTsiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPCEtLVxcbkxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZVxcbmNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aFxcbnRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5cXG5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMFxcbih0aGUgXFxcIkxpY2Vuc2VcXFwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoXFxudGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcXG5cXG5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcXG5cXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXFxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXFxcIkFTIElTXFxcIiBCQVNJUyxcXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXFxuLS0+XFxuXFxuPGRpdiBjbGFzcz1cXFwiZmRzLXNuYWNrYmFyLXdyYXBwZXJcXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJmZHMtc25hY2tiYXItdGl0bGVcXFwiICpuZ0lmPVxcXCJzbmFja0JhclRpdGxlLmxlbmd0aCA+IDBcXFwiPlxcbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVxcXCJmZHMtc25hY2tiYXItdGl0bGVcXFwiPjwvbmctY29udGVudD5cXG4gICAgPC9kaXY+XFxuICAgIDxkaXYgY2xhc3M9XFxcImZkcy1zbmFja2Jhci1jb250ZW50XFxcIiAqbmdJZj1cXFwic25hY2tCYXJDb250ZW50Lmxlbmd0aCA+IDBcXFwiPlxcbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVxcXCJmZHMtc25hY2tiYXItY29udGVudFxcXCI+PC9uZy1jb250ZW50PlxcbiAgICA8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiZmRzLXNuYWNrYmFyLWFjdGlvbnNcXFwiICpuZ0lmPVxcXCJzbmFja0JhckFjdGlvbnMubGVuZ3RoID4gMFxcXCIgbGF5b3V0PVxcXCJyb3dcXFwiPlxcbiAgICAgICAgPHNwYW4gZmxleD48L3NwYW4+XFxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XFxcImZkcy1zbmFja2Jhci1hY3Rpb25zXFxcIj48L25nLWNvbnRlbnQ+XFxuICAgIDwvZGl2PlxcbjwvZGl2PlxcblwiOyIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmVcbiAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aFxuICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlxuICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjBcbiAqICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGhcbiAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IENvbXBvbmVudCwgRGlyZWN0aXZlLCBDb250ZW50Q2hpbGRyZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiBGZHNTbmFja0JhclRpdGxlRGlyZWN0aXZlKCkge31cbkZkc1NuYWNrQmFyVGl0bGVEaXJlY3RpdmUucHJvdG90eXBlID0ge1xuICBjb250c3RydWN0b3I6IEZkc1NuYWNrQmFyVGl0bGVEaXJlY3RpdmVcbn07XG5GZHNTbmFja0JhclRpdGxlRGlyZWN0aXZlLmRlY29yYXRvcnMgPSBbe1xuICB0eXBlOiBEaXJlY3RpdmUsXG4gIGFyZ3M6IFt7XG4gICAgc2VsZWN0b3I6ICdmZHMtc25hY2tiYXItdGl0bGUnXG4gIH1dXG59XTtcbmV4cG9ydCBmdW5jdGlvbiBGZHNTbmFja0JhckNvbnRlbnREaXJlY3RpdmUoKSB7fVxuRmRzU25hY2tCYXJDb250ZW50RGlyZWN0aXZlLnByb3RvdHlwZSA9IHtcbiAgY29udHN0cnVjdG9yOiBGZHNTbmFja0JhckNvbnRlbnREaXJlY3RpdmVcbn07XG5GZHNTbmFja0JhckNvbnRlbnREaXJlY3RpdmUuZGVjb3JhdG9ycyA9IFt7XG4gIHR5cGU6IERpcmVjdGl2ZSxcbiAgYXJnczogW3tcbiAgICBzZWxlY3RvcjogJ2Zkcy1zbmFja2Jhci1jb250ZW50J1xuICB9XVxufV07XG5leHBvcnQgZnVuY3Rpb24gRmRzU25hY2tCYXJBY3Rpb25zRGlyZWN0aXZlKCkge31cbkZkc1NuYWNrQmFyQWN0aW9uc0RpcmVjdGl2ZS5wcm90b3R5cGUgPSB7XG4gIGNvbnRzdHJ1Y3RvcjogRmRzU25hY2tCYXJBY3Rpb25zRGlyZWN0aXZlXG59O1xuRmRzU25hY2tCYXJBY3Rpb25zRGlyZWN0aXZlLmRlY29yYXRvcnMgPSBbe1xuICB0eXBlOiBEaXJlY3RpdmUsXG4gIGFyZ3M6IFt7XG4gICAgc2VsZWN0b3I6ICdmZHMtc25hY2tiYXItYWN0aW9ucydcbiAgfV1cbn1dO1xuLyoqXG4gKiBGZHNTbmFja0JhckNvbXBvbmVudCBjb25zdHJ1Y3RvclxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICovXG5cbmZ1bmN0aW9uIEZkc1NuYWNrQmFyQ29tcG9uZW50KCkge1xuICB0aGlzLnNuYWNrQmFyVGl0bGUgPSAnJztcbiAgdGhpcy5zbmFja0JhckNvbnRlbnQgPSAnJztcbiAgdGhpcy5zbmFja0JhckFjdGlvbnMgPSAnJztcbn1cblxuRmRzU25hY2tCYXJDb21wb25lbnQucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogRmRzU25hY2tCYXJDb21wb25lbnQsXG5cbiAgLyoqXG4gICAqIFJlc3BvbmQgYWZ0ZXIgQW5ndWxhciBwcm9qZWN0cyBleHRlcm5hbCBjb250ZW50IGludG8gdGhlIGNvbXBvbmVudCdzIHZpZXcuXG4gICAqL1xuICBuZ0FmdGVyQ29udGVudEluaXQ6IGZ1bmN0aW9uIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICBpZiAodGhpcy5zbmFja0JhclRpdGxlLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRHVwbGljYXRlIGZkcy1zbmFja2Jhci10aXRsZSBjb21wb25lbnQgYXQgaW4gZmRzLXNuYWNrYmFyLicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNuYWNrQmFyQ29udGVudC5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0R1cGxpY2F0ZSBmZHMtc25hY2tiYXItY29udGVudCBjb21wb25lbnQgYXQgaW4gZmRzLXNuYWNrYmFyLicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNuYWNrQmFyQWN0aW9ucy5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0R1cGxpY2F0ZSBmZHMtc25hY2tiYXItYWN0aW9ucyBjb21wb25lbnQgYXQgaW4gZmRzLXNuYWNrYmFyLicpO1xuICAgIH1cbiAgfVxufTtcbkZkc1NuYWNrQmFyQ29tcG9uZW50LmFubm90YXRpb25zID0gW25ldyBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Zkcy1zbmFja2JhcicsXG4gIHRlbXBsYXRlOiByZXF1aXJlKCcuL2Zkcy1zbmFja2Jhci5jb21wb25lbnQuaHRtbCcpLFxuICBxdWVyaWVzOiB7XG4gICAgc25hY2tCYXJUaXRsZTogbmV3IENvbnRlbnRDaGlsZHJlbihGZHNTbmFja0JhclRpdGxlRGlyZWN0aXZlKSxcbiAgICBzbmFja0JhckNvbnRlbnQ6IG5ldyBDb250ZW50Q2hpbGRyZW4oRmRzU25hY2tCYXJDb250ZW50RGlyZWN0aXZlKSxcbiAgICBzbmFja0JhckFjdGlvbnM6IG5ldyBDb250ZW50Q2hpbGRyZW4oRmRzU25hY2tCYXJBY3Rpb25zRGlyZWN0aXZlKVxuICB9XG59KV07XG5GZHNTbmFja0JhckNvbXBvbmVudC5wYXJhbWV0ZXJzID0gW107XG5leHBvcnQgeyBGZHNTbmFja0JhckNvbXBvbmVudCB9OyIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmVcbiAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aFxuICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlxuICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjBcbiAqICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGhcbiAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGbGV4TGF5b3V0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZmxleC1sYXlvdXQnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSwgTWF0SWNvbk1vZHVsZSwgTWF0SW5wdXRNb2R1bGUsIE1hdFNuYWNrQmFyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBGZHNTbmFja0JhckNvbXBvbmVudCwgRmRzU25hY2tCYXJUaXRsZURpcmVjdGl2ZSwgRmRzU25hY2tCYXJBY3Rpb25zRGlyZWN0aXZlLCBGZHNTbmFja0JhckNvbnRlbnREaXJlY3RpdmUgfSBmcm9tICcuL2Zkcy1zbmFja2Jhci5jb21wb25lbnQnO1xuaW1wb3J0IHsgSUNvYXN0ZXJDb25maWcsIEZkc1NuYWNrQmFyU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvc25hY2tiYXIuc2VydmljZSc7XG5pbXBvcnQgeyBGZHNDb2FzdGVyQ29tcG9uZW50IH0gZnJvbSAnLi9jb2FzdGVyL2NvYXN0ZXIuY29tcG9uZW50JztcbnZhciBGRFNfU05BQ0tCQVJTID0gW0Zkc1NuYWNrQmFyQ29tcG9uZW50LCBGZHNTbmFja0JhclRpdGxlRGlyZWN0aXZlLCBGZHNTbmFja0JhckFjdGlvbnNEaXJlY3RpdmUsIEZkc1NuYWNrQmFyQ29udGVudERpcmVjdGl2ZSwgRmRzQ29hc3RlckNvbXBvbmVudF07XG52YXIgRkRTX1NOQUNLQkFSU19FTlRSWV9DT01QT05FTlRTID0gW0Zkc0NvYXN0ZXJDb21wb25lbnRdO1xuLyoqXG4gKiBGZHNTbmFja0JhcnNNb2R1bGUgY29uc3RydWN0b3IuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKi9cblxuZnVuY3Rpb24gRmRzU25hY2tCYXJzTW9kdWxlKCkge31cblxuRmRzU25hY2tCYXJzTW9kdWxlLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IEZkc1NuYWNrQmFyc01vZHVsZVxufTtcbkZkc1NuYWNrQmFyc01vZHVsZS5hbm5vdGF0aW9ucyA9IFtuZXcgTmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbRmxleExheW91dE1vZHVsZSwgRm9ybXNNb2R1bGUsIENvbW1vbk1vZHVsZSwgTWF0U25hY2tCYXJNb2R1bGUsIE1hdElucHV0TW9kdWxlLCBNYXRCdXR0b25Nb2R1bGUsIE1hdEljb25Nb2R1bGVdLFxuICBkZWNsYXJhdGlvbnM6IFtGRFNfU05BQ0tCQVJTXSxcbiAgZXhwb3J0czogW0ZEU19TTkFDS0JBUlNdLFxuICBwcm92aWRlcnM6IFtGZHNTbmFja0JhclNlcnZpY2VdLFxuICBlbnRyeUNvbXBvbmVudHM6IFtGRFNfU05BQ0tCQVJTX0VOVFJZX0NPTVBPTkVOVFNdXG59KV07XG5leHBvcnQgeyBGZHNTbmFja0JhcnNNb2R1bGUsIElDb2FzdGVyQ29uZmlnLCBGZHNTbmFja0JhclNlcnZpY2UsIEZkc1NuYWNrQmFyQ29tcG9uZW50LCBGZHNTbmFja0JhclRpdGxlRGlyZWN0aXZlLCBGZHNTbmFja0JhckNvbnRlbnREaXJlY3RpdmUsIEZkc1NuYWNrQmFyQWN0aW9uc0RpcmVjdGl2ZSwgRmRzQ29hc3RlckNvbXBvbmVudCB9OyIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmVcbiAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aFxuICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlxuICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjBcbiAqICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGhcbiAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IE1hdFNuYWNrQmFyQ29uZmlnLCBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsJztcbmltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgeyBGZHNDb2FzdGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vY29hc3Rlci9jb2FzdGVyLmNvbXBvbmVudCc7XG5leHBvcnQgZnVuY3Rpb24gSVNuYWNrQmFyQ29uZmlnKCkge1xuICB0aGlzLnRpdGxlID0gJyc7XG4gIHRoaXMubWVzc2FnZSA9ICcnO1xuICB0aGlzLnNuYWNrQmFyUmVmID0gdW5kZWZpbmVkO1xuICB0aGlzLnZpZXdDb250YWluZXJSZWYgPSB1bmRlZmluZWQ7XG59XG5JU25hY2tCYXJDb25maWcucHJvdG90eXBlID0ge1xuICBjb250c3RydWN0b3I6IElTbmFja0JhckNvbmZpZ1xufTtcbiQuZXh0ZW5kKElTbmFja0JhckNvbmZpZywgTWF0U25hY2tCYXJDb25maWcpO1xuZXhwb3J0IGZ1bmN0aW9uIElDb2FzdGVyQ29uZmlnKCkge1xuICB0aGlzLmljb24gPSAnJztcbiAgdGhpcy5jb2xvciA9ICcnO1xufVxuSUNvYXN0ZXJDb25maWcucHJvdG90eXBlID0ge1xuICBjb250c3RydWN0b3I6IElDb2FzdGVyQ29uZmlnXG59O1xuJC5leHRlbmQoSUNvYXN0ZXJDb25maWcsIElTbmFja0JhckNvbmZpZyk7XG4vKipcbiAqIEZkc1NuYWNrQmFyU2VydmljZSBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAcGFyYW0gTWF0U25hY2tCYXIgICAgICBUaGUgYW5ndWxhciBtYXRlcmlhbCBNYXRTbmFja0Jhci5cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBGZHNTbmFja0JhclNlcnZpY2UoTWF0U25hY2tCYXIpIHtcbiAgdGhpcy5zbmFja0JhclNlcnZpY2UgPSBNYXRTbmFja0Jhcjtcbn1cbkZkc1NuYWNrQmFyU2VydmljZS5wcm90b3R5cGUgPSB7XG4gIGNvbnRzdHJ1Y3RvcjogRmRzU25hY2tCYXJTZXJ2aWNlLFxuXG4gIC8qKlxuICAgKiBXcmFwcGVyIGZ1bmN0aW9uIG92ZXIgdGhlIG9wZW4oKSBtZXRob2QgaW4gTWF0U25hY2tCYXIuXG4gICAqXG4gICAqIEBwYXJhbSBtZXNzYWdlICAgICAgICAgICAgICAgVGhlIG1lc3NhZ2UgdG8gc2hvdyBpbiB0aGUgc25hY2tiYXIuXG4gICAqIEBwYXJhbSBhY3Rpb24gICAgICAgICAgICAgICAgVGhlIGxhYmVsIGZvciB0aGUgc25hY2tiYXIgYWN0aW9uLlxuICAgKiBAcGFyYW0gY29uZmlnICAgICAgICAgICAgICAgIEFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgc25hY2tiYXIuXG4gICAqXG4gICAqIEByZXR1cm5zIHtNYXRTbmFja0JhclJlZn0gICAgVGhlIHJlZmVyZW5jZSB0byB0aGUgc25hY2tiYXIuXG4gICAqL1xuICBvcGVuOiBmdW5jdGlvbiBvcGVuKG1lc3NhZ2UsIGFjdGlvbiwgY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuc25hY2tCYXJTZXJ2aWNlLm9wZW4obWVzc2FnZSwgYWN0aW9uLCBjb25maWcpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBXcmFwcGVyIGZ1bmN0aW9uIG92ZXIgdGhlIG9wZW5Gcm9tQ29tcG9uZW50KCkgbWV0aG9kIGluIE1hdFNuYWNrQmFyLlxuICAgKiBPcGVucyBhIHNuYWNrYmFyIGNvbnRhaW5pbmcgdGhlIGdpdmVuIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIGNvbXBvbmVudCAgICAgVGhlIGFuZ3VsYXIgQ29tcG9uZW50VHlwZTxUPi5cbiAgICogQHBhcmFtIGNvbmZpZyAgICAgICAgVGhlIGFuZ3VsYXIgbWF0ZXJpYWwgTWF0U25hY2tCYXJDb25maWcuXG4gICAqXG4gICAqIEByZXR1cm5zIHtNYXRTbmFja0JhclJlZn0gICAgVGhlIHJlZmVyZW5jZSB0byB0aGUgc25hY2tiYXIuXG4gICAqL1xuICBvcGVuRnJvbUNvbXBvbmVudDogZnVuY3Rpb24gb3BlbkZyb21Db21wb25lbnQoY29tcG9uZW50LCBjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5zbmFja0JhclNlcnZpY2Uub3BlbkZyb21Db21wb25lbnQoY29tcG9uZW50LCBjb25maWcpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBXcmFwcGVyIGZ1bmN0aW9uIG92ZXIgdGhlIGRpc21pc3MoKSBtZXRob2QgaW4gTWF0U25hY2tCYXIuXG4gICAqIERpc21pc3NlcyB0aGUgY3VycmVudGx5LW9wZW4gc25hY2tiYXIuXG4gICAqL1xuICBkaXNtaXNzOiBmdW5jdGlvbiBkaXNtaXNzKCkge1xuICAgIHRoaXMuc25hY2tCYXJTZXJ2aWNlLmRpc21pc3MoKTtcbiAgfSxcblxuICAvKipcbiAgICogT3BlbnMgYSBjb2FzdGVyIHNuYWNrYmFyIHdpdGggdGhlIHByb3ZpZGVkIGNvbmZpZy5cbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZyAgICAgSUNvYXN0ZXJDb25maWcge1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT86IHN0cmluZztcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPzogc3RyaW5nO1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25hY2tCYXJSZWY/OiBNYXRTbmFja0JhclJlZjtcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdDb250YWluZXJSZWY/OiBWaWV3Q29udGFpbmVyUmVmO1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj86IHN0cmluZztcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yPzogc3RyaW5nO1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgKlxuICAgKiBAcmV0dXJucyB7TWF0U25hY2tCYXJSZWZ9ICAgIFRoZSByZWZlcmVuY2UgdG8gdGhlIHNuYWNrYmFyLlxuICAgKi9cbiAgb3BlbkNvYXN0ZXI6IGZ1bmN0aW9uIG9wZW5Db2FzdGVyKGNvbmZpZykge1xuICAgIHZhciBzbmFja0JhckNvbmZpZyA9IG5ldyBJQ29hc3RlckNvbmZpZygpO1xuICAgIHNuYWNrQmFyQ29uZmlnLnZlcnRpY2FsUG9zaXRpb24gPSBjb25maWcudmVydGljYWxQb3NpdGlvbjtcbiAgICBzbmFja0JhckNvbmZpZy5ob3Jpem9udGFsUG9zaXRpb24gPSBjb25maWcuaG9yaXpvbnRhbFBvc2l0aW9uO1xuICAgIHNuYWNrQmFyQ29uZmlnLmR1cmF0aW9uID0gY29uZmlnLmR1cmF0aW9uO1xuICAgIHZhciBzbmFja0JhclJlZiA9IHRoaXMuc25hY2tCYXJTZXJ2aWNlLm9wZW5Gcm9tQ29tcG9uZW50KEZkc0NvYXN0ZXJDb21wb25lbnQsIHNuYWNrQmFyQ29uZmlnKTtcbiAgICB2YXIgY29hc3RlckNvbXBvbmVudCA9IHNuYWNrQmFyUmVmLmluc3RhbmNlO1xuICAgIGNvYXN0ZXJDb21wb25lbnQuc25hY2tCYXJSZWYgPSBzbmFja0JhclJlZjtcblxuICAgIGlmIChjb25maWcudGl0bGUpIHtcbiAgICAgIGNvYXN0ZXJDb21wb25lbnQudGl0bGUgPSBjb25maWcudGl0bGU7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5tZXNzYWdlKSB7XG4gICAgICBjb2FzdGVyQ29tcG9uZW50Lm1lc3NhZ2UgPSBjb25maWcubWVzc2FnZTtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmljb24pIHtcbiAgICAgIGNvYXN0ZXJDb21wb25lbnQuaWNvbiA9IGNvbmZpZy5pY29uO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuY29sb3IpIHtcbiAgICAgIGNvYXN0ZXJDb21wb25lbnQuY29sb3IgPSBjb25maWcuY29sb3I7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNuYWNrQmFyUmVmO1xuICB9XG59O1xuRmRzU25hY2tCYXJTZXJ2aWNlLnBhcmFtZXRlcnMgPSBbTWF0U25hY2tCYXJdOyIsIm1vZHVsZS5leHBvcnRzID0gXCI8IS0tXFxuTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlXFxuY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoXFxudGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlxcblRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wXFxuKHRoZSBcXFwiTGljZW5zZVxcXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGhcXG50aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxcblxcbmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxcblxcblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcXFwiQVMgSVNcXFwiIEJBU0lTLFxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxcblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cXG4tLT5cXG5cXG48ZGl2PkhlbGxvIERpYWxvZyE8L2Rpdj5cXG5cIjsiLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlXG4gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGhcbiAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5cbiAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wXG4gKiAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoXG4gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgeyBNYXREaWFsb2dSZWYsIE1BVF9ESUFMT0dfREFUQSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsJztcbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuLyoqXG4gKiBOZlJlZ2lzdHJ5RWRpdEJ1Y2tldFBvbGljeSBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAcGFyYW0gbmZSZWdpc3RyeUFwaSAgICAgICAgIFRoZSBhcGkgc2VydmljZS5cbiAqIEBwYXJhbSBuZlJlZ2lzdHJ5U2VydmljZSAgICAgVGhlIG5mLXJlZ2lzdHJ5LnNlcnZpY2UgbW9kdWxlLlxuICogQHBhcmFtIGFjdGl2YXRlZFJvdXRlICAgICAgICBUaGUgYW5ndWxhciByb3V0ZSBtb2R1bGUuXG4gKiBAcGFyYW0gbWF0RGlhbG9nUmVmICAgICAgICAgIFRoZSBhbmd1bGFyIG1hdGVyaWFsIGRpYWxvZyByZWYuXG4gKiBAcGFyYW0gZGF0YSAgICAgICAgICAgICAgICAgIFRoZSBkYXRhIHBhc3NlZCBpbnRvIHRoaXMgY29tcG9uZW50LlxuICogQGNvbnN0cnVjdG9yXG4gKi9cblxuZnVuY3Rpb24gRmRzRGVtb0RpYWxvZyhtYXREaWFsb2dSZWYsIGRhdGEpIHtcbiAgLy8gU2VydmljZXNcbiAgdGhpcy5kaWFsb2dSZWYgPSBtYXREaWFsb2dSZWY7XG4gIHRoaXMuZGF0YSA9IGRhdGE7XG59XG5cbkZkc0RlbW9EaWFsb2cucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogRmRzRGVtb0RpYWxvZyxcblxuICAvKipcbiAgICogQ2FuY2VsIGNyZWF0aW9uIG9mIGEgbmV3IHBvbGljeSBhbmQgY2xvc2UgZGlhbG9nLlxuICAgKi9cbiAgY2FuY2VsOiBmdW5jdGlvbiBjYW5jZWwoKSB7XG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoKTtcbiAgfVxufTtcbkZkc0RlbW9EaWFsb2cuYW5ub3RhdGlvbnMgPSBbbmV3IENvbXBvbmVudCh7XG4gIHRlbXBsYXRlOiByZXF1aXJlKCcuL2Zkcy1kZW1vLWRpYWxvZy5odG1sJyl9KV07XG5GZHNEZW1vRGlhbG9nLnBhcmFtZXRlcnMgPSBbTWF0RGlhbG9nUmVmLCBNQVRfRElBTE9HX0RBVEFdO1xuZXhwb3J0IGRlZmF1bHQgRmRzRGVtb0RpYWxvZzsiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPCEtLVxcbkxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZVxcbmNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aFxcbnRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5cXG5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMFxcbih0aGUgXFxcIkxpY2Vuc2VcXFwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoXFxudGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcXG5cXG5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcXG5cXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXFxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXFxcIkFTIElTXFxcIiBCQVNJUyxcXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXFxuLS0+XFxuXFxuPG1hdC1zaWRlbmF2LWNvbnRhaW5lcj5cXG4gICAgPG1hdC1zaWRlbmF2ICNzaWRlbmF2IG1vZGU9XFxcIm92ZXJcXFwiIHBvc2l0aW9uPVxcXCJlbmRcXFwiIG9wZW5lZD1cXFwiZmFsc2VcXFwiPlxcbiAgICAgICAgPGRpdiBmeExheW91dD1cXFwiY29sdW1uXFxcIiBmeExheW91dEFsaWduPVxcXCJzcGFjZS1iZXR3ZWVuIGNlbnRlclxcXCI+XFxuICAgICAgICAgICAgPHA+WW91IGNhbiBhbHNvIG9wZW4gYSBkaWFsb2cgZnJvbSBhIHNpZGUgbmF2LjwvcD5cXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVxcXCJmZHMtcHJpbWFyeVxcXCIgKGNsaWNrKT1cXFwib3BlbkRpYWxvZygpXFxcIj5TaG93IHNpbXBsZSBkaWFsb2c8L2J1dHRvbj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L21hdC1zaWRlbmF2PlxcbiAgICA8ZGl2IGlkPVxcXCJmZHMtZGVtb1xcXCI+XFxuICAgICAgICA8bWF0LWNhcmQ+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLXRpdGxlIGNsYXNzPVxcXCJwYWQtYm90dG9tLXNtXFxcIj5BcGFjaGUgTmlGaSBGbG93IERlc2lnbiBTeXN0ZW08L21hdC1jYXJkLXRpdGxlPlxcbiAgICAgICAgICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxcbiAgICAgICAgICAgIDxtYXQtY2FyZC1jb250ZW50IGNsYXNzPVxcXCJwYWQtdG9wLXNtXFxcIj5cXG4gICAgICAgICAgICAgICAgPHA+V2l0aCB0aGUgQXBhY2hlIE5pRmkgRmxvdyBEZXNpZ24gU3lzdGVtIG1vZHVsZSwgd2UgZ2V0IGFuIGF0b21pYywgcmV1c2FibGUgY29tcG9uZW50IHBsYXRmb3JtIGZvclxcbiAgICAgICAgICAgICAgICAgICAgQXBhY2hlIE5pRmkgYW5kIGl0cyBzdWItcHJvamVjdHMgdG8gY29uc3VtZSwgd2hpbGUgY29sbGFib3JhdGluZyBpbiBhbiBvcGVuIHNvdXJjZSBtb2RlbC4gVGhpc1xcbiAgICAgICAgICAgICAgICAgICAgbW9kdWxlIHBhY2thZ2VzIHRoZSA8YSBjbGFzcz1cXFwibGlua1xcXCIgaHJlZj1cXFwiaHR0cHM6Ly9tYXRlcmlhbC5hbmd1bGFyLmlvL2NvbXBvbmVudHNcXFwiIHRhcmdldD1cXFwiX2JsYW5rXFxcIj5Bbmd1bGFyXFxuICAgICAgICAgICAgICAgICAgICAgICAgTWF0ZXJpYWw8L2E+IG1vZHVsZSBhcyB3ZWxsIGFzIHRoZSA8YSBjbGFzcz1cXFwibGlua1xcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9XFxcImh0dHBzOi8vdGVyYWRhdGEuZ2l0aHViLmlvL2NvdmFsZW50LyMvY29tcG9uZW50c1xcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldD1cXFwiX2JsYW5rXFxcIj5UZXJhZGF0YSBDb3ZhbGVudDwvYT4gbW9kdWxlLiBUaGVzZVxcbiAgICAgICAgICAgICAgICAgICAgbW9kdWxlcyBoYXZlIGJlZW4gdGhlbWVkIHRvIG1hdGNoIHRoZSBGRFMgY29sb3IgcGFsZXR0ZS48L3A+XFxuICAgICAgICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxcbiAgICAgICAgPC9tYXQtY2FyZD5cXG4gICAgICAgIDxtYXQtY2FyZD5cXG4gICAgICAgICAgICA8bWF0LWNhcmQtdGl0bGUgY2xhc3M9XFxcInBhZC1ib3R0b20tc21cXFwiIGlkPVxcXCJUeXBvZ3JhcGh5XFxcIj5UeXBvZ3JhcGh5IDxtYXQtaWNvbiBjbGFzcz1cXFwibGluay10by1jb21wb25lbnRcXFwiIHJvdXRlckxpbms9XFxcIi9cXFwiIGZyYWdtZW50PVxcXCJUeXBvZ3JhcGh5XFxcIj5saW5rPC9tYXQtaWNvbj48L21hdC1jYXJkLXRpdGxlPlxcbiAgICAgICAgICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxcbiAgICAgICAgICAgIDxtYXQtY2FyZC1jb250ZW50PlxcbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cXFwibWF0LWJvZHktMVxcXCI+RkRTIHByb3ZpZGVzIHR5cG9ncmFwaHkgQ1NTIGNsYXNzZXMgeW91IGNhbiB1c2UgdG8gY3JlYXRlIHZpc3VhbCBjb25zaXN0ZW5jeSBhY3Jvc3MgeW91ciBhcHBsaWNhdGlvbi4gT3B0aW9uYWxseSBzdHlsZSB0YWdzIHdpdGggdGhlIGNsYXNzZXMgc2hvd24gYmVsb3c6PC9wPlxcbiAgICAgICAgICAgICAgICA8ZGl2IGxheW91dC1hbGlnbj1cXFwiY2VudGVyIGVuZFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGxheW91dD1cXFwicm93XFxcIiBsYXlvdXQtYWxpZ249XFxcInN0YXJ0IGNlbnRlclxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGUgZmxleD1cXFwiMTVcXFwiPi5tYXQtZGlzcGxheS00PC9jb2RlPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJtYXQtZGlzcGxheS00XFxcIj5EaXNwbGF5IDQ8L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgbGF5b3V0PVxcXCJyb3dcXFwiIGxheW91dC1hbGlnbj1cXFwic3RhcnQgY2VudGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8Y29kZSBmbGV4PVxcXCIxNVxcXCI+Lm1hdC1kaXNwbGF5LTM8L2NvZGU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcIm1hdC1kaXNwbGF5LTNcXFwiPkRpc3BsYXkgMzwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBsYXlvdXQ9XFxcInJvd1xcXCIgbGF5b3V0LWFsaWduPVxcXCJzdGFydCBjZW50ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlIGZsZXg9XFxcIjE1XFxcIj4ubWF0LWRpc3BsYXktMjwvY29kZT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwibWF0LWRpc3BsYXktMlxcXCI+RGlzcGxheSAyPC9zcGFuPlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGxheW91dD1cXFwicm93XFxcIiBsYXlvdXQtYWxpZ249XFxcInN0YXJ0IGNlbnRlclxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGUgZmxleD1cXFwiMTVcXFwiPi5tYXQtZGlzcGxheS0xPC9jb2RlPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJtYXQtZGlzcGxheS0xXFxcIj5EaXNwbGF5IDE8L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgbGF5b3V0PVxcXCJyb3dcXFwiIGxheW91dC1hbGlnbj1cXFwic3RhcnQgY2VudGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8Y29kZSBmbGV4PVxcXCIxNVxcXCI+Lm1hdC1oZWFkbGluZTwvY29kZT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwibWF0LWhlYWRsaW5lXFxcIj5IZWFkbGluZTwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBsYXlvdXQ9XFxcInJvd1xcXCIgbGF5b3V0LWFsaWduPVxcXCJzdGFydCBjZW50ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlIGZsZXg9XFxcIjE1XFxcIj4ubWQtdGl0bGU8L2NvZGU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcIm1kLXRpdGxlXFxcIj5UaXRsZTwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBsYXlvdXQ9XFxcInJvd1xcXCIgbGF5b3V0LWFsaWduPVxcXCJzdGFydCBjZW50ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlIGZsZXg9XFxcIjE1XFxcIj4ubWQtc3ViaGVhZDwvY29kZT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwibWQtc3ViaGVhZFxcXCI+U3ViaGVhZDwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBsYXlvdXQ9XFxcInJvd1xcXCIgbGF5b3V0LWFsaWduPVxcXCJzdGFydCBjZW50ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlIGZsZXg9XFxcIjE1XFxcIj4ubGluazwvY29kZT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwibGlua1xcXCI+TGluazwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBsYXlvdXQ9XFxcInJvd1xcXCIgbGF5b3V0LWFsaWduPVxcXCJzdGFydCBjZW50ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlIGZsZXg9XFxcIjE1XFxcIj4ubWF0LWJvZHktMTwvY29kZT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwibWF0LWJvZHktMVxcXCI+Qm9keSAxPC9zcGFuPlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGxheW91dD1cXFwicm93XFxcIiBsYXlvdXQtYWxpZ249XFxcInN0YXJ0IGNlbnRlclxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGUgZmxleD1cXFwiMTVcXFwiPi5tYXQtYm9keS0yPC9jb2RlPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJtYXQtYm9keS0yXFxcIj5Cb2R5IDI8L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgbGF5b3V0PVxcXCJyb3dcXFwiIGxheW91dC1hbGlnbj1cXFwic3RhcnQgY2VudGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8Y29kZSBmbGV4PVxcXCIxNVxcXCI+Lm1hdC1jYXB0aW9uPC9jb2RlPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJtYXQtY2FwdGlvblxcXCI+Q2FwdGlvbjwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgPGgzIGNsYXNzPVxcXCJtZC10aXRsZVxcXCI+VXNhZ2U8L2gzPlxcbiAgICAgICAgICAgICAgICA8cD5IVE1MOjwvcD5cXG4gICAgPHByZSBsYW5nPVxcXCJodG1sXFxcIj5cXG4gICAgPCFbQ0RBVEFbXFxuICAgICAgICA8c3BhbiBjbGFzcz1cXFwibWF0LWRpc3BsYXktNFxcXCI+RGlzcGxheSA0PC9zcGFuPlxcbiAgICAgICAgPHNwYW4gY2xhc3M9XFxcIm1hdC1kaXNwbGF5LTNcXFwiPkRpc3BsYXkgMzwvc3Bhbj5cXG4gICAgICAgIDxzcGFuIGNsYXNzPVxcXCJtYXQtZGlzcGxheS0yXFxcIj5EaXNwbGF5IDI8L3NwYW4+XFxuICAgICAgICA8c3BhbiBjbGFzcz1cXFwibWF0LWRpc3BsYXktMVxcXCI+RGlzcGxheSAxPC9zcGFuPlxcbiAgICAgICAgPHNwYW4gY2xhc3M9XFxcIm1hdC1oZWFkbGluZVxcXCI+SGVhZGxpbmU8L3NwYW4+XFxuICAgICAgICA8c3BhbiBjbGFzcz1cXFwibWQtdGl0bGVcXFwiPlRpdGxlPC9zcGFuPlxcbiAgICAgICAgPHNwYW4gY2xhc3M9XFxcIm1kLXN1YmhlYWRcXFwiPlN1YmhlYWQ8L3NwYW4+XFxuICAgICAgICA8c3BhbiBjbGFzcz1cXFwibGlua1xcXCI+TGluazwvc3Bhbj5cXG4gICAgICAgIDxzcGFuIGNsYXNzPVxcXCJtYXQtYm9keS0xXFxcIj5Cb2R5IDE8L3NwYW4+XFxuICAgICAgICA8c3BhbiBjbGFzcz1cXFwibWF0LWJvZHktMlxcXCI+Qm9keSAyPC9zcGFuPlxcbiAgICAgICAgPHNwYW4gY2xhc3M9XFxcIm1hdC1jYXB0aW9uXFxcIj5DYXB0aW9uPC9zcGFuPlxcbiAgICBdXT5cXG4gICAgPC9wcmU+XFxuICAgICAgICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxcbiAgICAgICAgPC9tYXQtY2FyZD5cXG4gICAgICAgIDxtYXQtY2FyZD5cXG4gICAgICAgICAgICA8bWF0LWNhcmQtdGl0bGUgY2xhc3M9XFxcInBhZC1ib3R0b20tc21cXFwiIGlkPVxcXCJSYWlzZWRCdXR0b25zXFxcIj5SYWlzZWQgQnV0dG9ucyA8bWF0LWljb24gY2xhc3M9XFxcImxpbmstdG8tY29tcG9uZW50XFxcIiByb3V0ZXJMaW5rPVxcXCIvXFxcIiBmcmFnbWVudD1cXFwiUmFpc2VkQnV0dG9uc1xcXCI+bGluazwvbWF0LWljb24+PC9tYXQtY2FyZC10aXRsZT5cXG4gICAgICAgICAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cXG4gICAgICAgICAgICA8bWF0LWNhcmQtY29udGVudD5cXG4gICAgICAgICAgICAgICAgPHA+VGlwOiBVc2UgVVBQRVJDQVNFIHRleHQgZm9yIDEtMiB3b3JkcywgYW5kIFRpdGxlY2FzZSB0ZXh0IGZvciAzKyB3b3Jkcy48L3A+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XFxcInByaW1hcnlcXFwiPlByaW1hcnk8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cXFwiYWNjZW50XFxcIj5BY2NlbnQ8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cXFwid2FyblxcXCI+V2FybjwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVxcXCJmZHMtcHJpbWFyeVxcXCI+RkRTIFByaW1hcnk8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cXFwiZmRzLXNlY29uZGFyeVxcXCI+RkRTIFNlY29uZGFyeTwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVxcXCJmZHMtcmVndWxhclxcXCI+RkRTIHJlZ3VsYXI8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cXFwiZmRzLXdhcm5cXFwiPkZEUyB3YXJuPC9idXR0b24+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XFxcImZkcy1jcml0aWNhbFxcXCI+RkRTIGNyaXRpY2FsPC9idXR0b24+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gZGlzYWJsZWQgY29sb3I9XFxcInByaW1hcnlcXFwiPlByaW1hcnk8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBkaXNhYmxlZCBjb2xvcj1cXFwiYWNjZW50XFxcIj5BY2NlbnQ8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBkaXNhYmxlZCBjb2xvcj1cXFwid2FyblxcXCI+V2FybjwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGRpc2FibGVkIGNvbG9yPVxcXCJmZHMtcHJpbWFyeVxcXCI+RkRTIHByaW1hcnk8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBkaXNhYmxlZCBjb2xvcj1cXFwiZmRzLXNlY29uZGFyeVxcXCI+RkRTIFNlY29uZGFyeTwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGRpc2FibGVkIGNvbG9yPVxcXCJmZHMtcmVndWxhclxcXCI+RkRTIHJlZ3VsYXI8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBkaXNhYmxlZCBjb2xvcj1cXFwiZmRzLXdhcm5cXFwiPkZEUyB3YXJuPC9idXR0b24+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gZGlzYWJsZWQgY29sb3I9XFxcImZkcy1jcml0aWNhbFxcXCI+RkRTIGNyaXRpY2FsPC9idXR0b24+XFxuICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cXFwibWQtdGl0bGVcXFwiPlVzYWdlPC9oMz5cXG4gICAgICAgICAgICAgICAgPHA+SFRNTDo8L3A+XFxuICAgICAgICAgICAgICAgIDxwcmUgbGFuZz1cXFwiaHRtbFxcXCI+XFxuICAgIDwhW0NEQVRBW1xcbiAgICAgICAgPCEtLSBUaGVtZWQgUmFpc2VkIEJ1dHRvbnMgLS0+XFxuICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVxcXCJwcmltYXJ5XFxcIj5QcmltYXJ5PC9idXR0b24+XFxuICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVxcXCJhY2NlbnRcXFwiPlNlY29uZGFyeTwvYnV0dG9uPlxcbiAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cXFwid2FyblxcXCI+d2FybjwvYnV0dG9uPlxcbiAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cXFwiZmRzLXByaW1hcnlcXFwiPkZEUyBQcmltYXJ5PC9idXR0b24+XFxuICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVxcXCJmZHMtc2Vjb25kYXJ5XFxcIj5GRFMgU2Vjb25kYXJ5PC9idXR0b24+XFxuICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVxcXCJmZHMtcmVndWxhclxcXCI+RkRTIHJlZ3VsYXI8L2J1dHRvbj5cXG4gICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XFxcImZkcy13YXJuXFxcIj5GRFMgd2FybjwvYnV0dG9uPlxcbiAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cXFwiZmRzLWNyaXRpY2FsXFxcIj5GRFMgY3JpdGljYWw8L2J1dHRvbj5cXG4gICAgICAgIDwhLS0gRGlzYWJsZWQgUmFpc2VkIEJ1dHRvbnMgLS0+XFxuICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGRpc2FibGVkIGNvbG9yPVxcXCJwcmltYXJ5XFxcIj5QcmltYXJ5PC9idXR0b24+XFxuICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGRpc2FibGVkIGNvbG9yPVxcXCJhY2NlbnRcXFwiPlNlY29uZGFyeTwvYnV0dG9uPlxcbiAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBkaXNhYmxlZCBjb2xvcj1cXFwid2FyblxcXCI+d2FybjwvYnV0dG9uPlxcbiAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBkaXNhYmxlZCBjb2xvcj1cXFwiZmRzLXByaW1hcnlcXFwiPkZEUyBwcmltYXJ5PC9idXR0b24+XFxuICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGRpc2FibGVkIGNvbG9yPVxcXCJmZHMtc2Vjb25kYXJ5XFxcIj5GRFMgU2Vjb25kYXJ5PC9idXR0b24+XFxuICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGRpc2FibGVkIGNvbG9yPVxcXCJmZHMtcmVndWxhclxcXCI+RkRTIHJlZ3VsYXI8L2J1dHRvbj5cXG4gICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gZGlzYWJsZWQgY29sb3I9XFxcImZkcy13YXJuXFxcIj5GRFMgd2FybjwvYnV0dG9uPlxcbiAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBkaXNhYmxlZCBjb2xvcj1cXFwiZmRzLWNyaXRpY2FsXFxcIj5GRFMgY3JpdGljYWw8L2J1dHRvbj5cXG4gICAgXV0+XFxuICAgIDwvcHJlPlxcbiAgICAgICAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cXG4gICAgICAgIDwvbWF0LWNhcmQ+XFxuICAgICAgICA8bWF0LWNhcmQ+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLXRpdGxlIGNsYXNzPVxcXCJwYWQtYm90dG9tLXNtXFxcIiBpZD1cXFwiRmxhdEJ1dHRvbnNcXFwiPkZsYXQgQnV0dG9ucyA8bWF0LWljb24gY2xhc3M9XFxcImxpbmstdG8tY29tcG9uZW50XFxcIiByb3V0ZXJMaW5rPVxcXCIvXFxcIiBmcmFnbWVudD1cXFwiRmxhdEJ1dHRvbnNcXFwiPmxpbms8L21hdC1pY29uPjwvbWF0LWNhcmQtdGl0bGU+XFxuICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICAgICAgICAgIDxtYXQtY2FyZC1hY3Rpb25zPlxcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uPkRlZmF1bHQ8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBjb2xvcj1cXFwicHJpbWFyeVxcXCI+UHJpbWFyeTwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNvbG9yPVxcXCJhY2NlbnRcXFwiPlNlY29uZGFyeTwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNvbG9yPVxcXCJ3YXJuXFxcIj5XYXJuPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gZGlzYWJsZWQ+RGlzYWJsZWQgRGVmYXVsdDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGRpc2FibGVkIGNvbG9yPVxcXCJwcmltYXJ5XFxcIj5EaXNhYmxlZCBQcmltYXJ5PC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gZGlzYWJsZWQgY29sb3I9XFxcImFjY2VudFxcXCI+RGlzYWJsZWQgU2Vjb25kYXJ5PC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gZGlzYWJsZWQgY29sb3I9XFxcIndhcm5cXFwiPkRpc2FibGVkIFdhcm48L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPC9tYXQtY2FyZC1hY3Rpb25zPlxcbiAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XFxcIm1kLXRpdGxlXFxcIj5Vc2FnZTwvaDM+XFxuICAgICAgICAgICAgICAgIDxwPkhUTUw6PC9wPlxcbiAgICAgICAgICAgICAgICA8cHJlIGxhbmc9XFxcImh0bWxcXFwiPlxcbiAgICA8IVtDREFUQVtcXG4gICAgICAgIDwhLS0gVGhlbWVkIEZsYXQgQnV0dG9ucyAtLT5cXG4gICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbj5EZWZhdWx0PC9idXR0b24+XFxuICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gY29sb3I9XFxcInByaW1hcnlcXFwiPlByaW1hcnk8L2J1dHRvbj5cXG4gICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBjb2xvcj1cXFwiYWNjZW50XFxcIj5TZWNvbmRhcnk8L2J1dHRvbj5cXG4gICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBjb2xvcj1cXFwid2FyblxcXCI+d2FybjwvYnV0dG9uPlxcbiAgICAgICAgPCEtLSBEaXNhYmxlZCBGbGF0IEJ1dHRvbnMgLS0+XFxuICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gZGlzYWJsZWQ+ZGlzYWJsZWQgRGVmYXVsdDwvYnV0dG9uPlxcbiAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGRpc2FibGVkIGNvbG9yPVxcXCJwcmltYXJ5XFxcIj5kaXNhYmxlZCBwcmltYXJ5PC9idXR0b24+XFxuICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gZGlzYWJsZWQgY29sb3I9XFxcImFjY2VudFxcXCI+ZGlzYWJsZWQgU2Vjb25kYXJ5PC9idXR0b24+XFxuICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gZGlzYWJsZWQgY29sb3I9XFxcIndhcm5cXFwiPmRpc2FibGVkIHdhcm48L2J1dHRvbj5cXG4gICAgXV0+XFxuICAgIDwvcHJlPlxcbiAgICAgICAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cXG4gICAgICAgIDwvbWF0LWNhcmQ+XFxuICAgICAgICA8bWF0LWNhcmQ+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLXRpdGxlIGNsYXNzPVxcXCJwYWQtYm90dG9tLXNtXFxcIiBpZD1cXFwiRmFiQnV0dG9uc1xcXCI+RmFiIEJ1dHRvbnMgPG1hdC1pY29uIGNsYXNzPVxcXCJsaW5rLXRvLWNvbXBvbmVudFxcXCIgcm91dGVyTGluaz1cXFwiL1xcXCIgZnJhZ21lbnQ9XFxcIkZhYkJ1dHRvbnNcXFwiPmxpbms8L21hdC1pY29uPjwvbWF0LWNhcmQtdGl0bGU+XFxuICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICAgICAgICAgIDxtYXQtY2FyZC1hY3Rpb25zIGNsYXNzPVxcXCJwYWQtbGVmdC1zbVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1taW5pLWZhYiBjb2xvcj1cXFwicHJpbWFyeVxcXCI+UDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWluaS1mYWIgY29sb3I9XFxcImFjY2VudFxcXCI+QTwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWluaS1mYWIgY29sb3I9XFxcIndhcm5cXFwiPlc8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1pbmktZmFiIGRpc2FibGVkIGNvbG9yPVxcXCJwcmltYXJ5XFxcIj5QPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1taW5pLWZhYiBkaXNhYmxlZCBjb2xvcj1cXFwiYWNjZW50XFxcIj5BPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1taW5pLWZhYiBkaXNhYmxlZCBjb2xvcj1cXFwid2FyblxcXCI+VzwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICA8L21hdC1jYXJkLWFjdGlvbnM+XFxuICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cXFwibWQtdGl0bGVcXFwiPlVzYWdlPC9oMz5cXG4gICAgICAgICAgICAgICAgPHA+SFRNTDo8L3A+XFxuICAgICAgICAgICAgICAgIDxwcmUgbGFuZz1cXFwiaHRtbFxcXCI+XFxuICAgIDwhW0NEQVRBW1xcbiAgICAgICAgPCEtLSBUaGVtZWQgRmFiIEJ1dHRvbnMgLS0+XFxuICAgICAgICA8YnV0dG9uIG1hdC1taW5pLWZhYiBjb2xvcj1cXFwicHJpbWFyeVxcXCI+UDwvYnV0dG9uPlxcbiAgICAgICAgPGJ1dHRvbiBtYXQtbWluaS1mYWIgY29sb3I9XFxcImFjY2VudFxcXCI+QTwvYnV0dG9uPlxcbiAgICAgICAgPGJ1dHRvbiBtYXQtbWluaS1mYWIgY29sb3I9XFxcIndhcm5cXFwiPlc8L2J1dHRvbj5cXG4gICAgICAgIDwhLS0gRGlzYWJsZWQgRmFiIEJ1dHRvbnMgLS0+XFxuICAgICAgICA8YnV0dG9uIG1hdC1taW5pLWZhYiBkaXNhYmxlZCBjb2xvcj1cXFwicHJpbWFyeVxcXCI+UDwvYnV0dG9uPlxcbiAgICAgICAgPGJ1dHRvbiBtYXQtbWluaS1mYWIgZGlzYWJsZWQgY29sb3I9XFxcImFjY2VudFxcXCI+QTwvYnV0dG9uPlxcbiAgICAgICAgPGJ1dHRvbiBtYXQtbWluaS1mYWIgZGlzYWJsZWQgY29sb3I9XFxcIndhcm5cXFwiPlc8L2J1dHRvbj5cXG4gICAgXV0+XFxuICAgIDwvcHJlPlxcbiAgICAgICAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cXG4gICAgICAgIDwvbWF0LWNhcmQ+XFxuICAgICAgICA8bWF0LWNhcmQ+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLXRpdGxlIGNsYXNzPVxcXCJwYWQtYm90dG9tLXNtXFxcIiBpZD1cXFwiQnV0dG9uVG9nZ2xlc1xcXCI+QnV0dG9uIFRvZ2dsZXMgPG1hdC1pY29uIGNsYXNzPVxcXCJsaW5rLXRvLWNvbXBvbmVudFxcXCIgcm91dGVyTGluaz1cXFwiL1xcXCIgZnJhZ21lbnQ9XFxcIkJ1dHRvblRvZ2dsZXNcXFwiPmxpbms8L21hdC1pY29uPjwvbWF0LWNhcmQtdGl0bGU+XFxuICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICAgICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZS1ncm91cCBuYW1lPVxcXCJhbGlnbm1lbnRcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIHZhbHVlPVxcXCJsZWZ0XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+Zm9ybWF0X2FsaWduX2xlZnQ8L21hdC1pY29uPlxcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZSB2YWx1ZT1cXFwiY2VudGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+Zm9ybWF0X2FsaWduX2NlbnRlcjwvbWF0LWljb24+XFxuICAgICAgICAgICAgICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIHZhbHVlPVxcXCJyaWdodFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmZvcm1hdF9hbGlnbl9yaWdodDwvbWF0LWljb24+XFxuICAgICAgICAgICAgICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIHZhbHVlPVxcXCJqdXN0aWZ5XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+Zm9ybWF0X2FsaWduX2p1c3RpZnk8L21hdC1pY29uPlxcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cXG4gICAgICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cD5cXG4gICAgICAgICAgICAgICAgPGRpdiBmeExheW91dD1cXFwicm93XFxcIiBjbGFzcz1cXFwicGFkLXRvcC1tZCBwYWQtYm90LW1kXFxcIj48L2Rpdj5cXG4gICAgICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlLWdyb3VwIG5hbWU9XFxcIm9uT2ZmVG9nZ2xlXFxcIiBjbGFzcz1cXFwib24tb2ZmLXRvZ2dsZS1ncm91cFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGUgdmFsdWU9XFxcIm9uXFxcIiBbY2hlY2tlZF09XFxcInRydWVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIE9OXFxuICAgICAgICAgICAgICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIHZhbHVlPVxcXCJvZmZcXFwiIGNsYXNzPVxcXCJvZmYtdG9nZ2xlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICBPRkZcXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XFxuICAgICAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXA+XFxuICAgICAgICAgICAgICAgIDxkaXYgZnhMYXlvdXQ9XFxcInJvd1xcXCIgY2xhc3M9XFxcInBhZC10b3AtbWQgcGFkLWJvdC1tZFxcXCI+PC9kaXY+XFxuICAgICAgICAgICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZS1ncm91cCBmeExheW91dD1cXFwicm93XFxcIiBmeExheW91dEFsaWduPVxcXCJzcGFjZS1iZXR3ZWVuIGNlbnRlclxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVxcXCJleHBhbnNpb24tcGFuZWwtZmlsdGVyLXRvZ2dsZS1ncm91cFxcXCIgbXVsdGlwbGU+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBmeEZsZXggZnhMYXlvdXQ9XFxcImNvbHVtblxcXCIgZnhMYXlvdXRBbGlnbj1cXFwic3BhY2UtYXJvdW5kIHN0cmV0Y2hcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtYXQtZGlzcGxheS0xIHBhZC10b3Atc21cXFwiIGZ4RmxleD1cXFwiNTVcXFwiPjM0PC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhZC10b3Atc21cXFwiIGZ4RmxleD1cXFwiNDVcXFwiPkFzc2V0czwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZ4RmxleCBmeExheW91dD1cXFwiY29sdW1uXFxcIiBmeExheW91dEFsaWduPVxcXCJzcGFjZS1hcm91bmQgc3RyZXRjaFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1hdC1kaXNwbGF5LTEgcGFkLXRvcC1zbVxcXCIgZnhGbGV4PVxcXCI1NVxcXCI+MzAwPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhZC10b3Atc21cXFwiIGZ4RmxleD1cXFwiNDVcXFwiPkV4dGVuc2lvbnM8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBmeEZsZXggZnhMYXlvdXQ9XFxcImNvbHVtblxcXCIgZnhMYXlvdXRBbGlnbj1cXFwic3BhY2UtYXJvdW5kIHN0cmV0Y2hcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtYXQtZGlzcGxheS0xIHBhZC10b3Atc21cXFwiIGZ4RmxleD1cXFwiNTVcXFwiPjUwMDA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFkLXRvcC1zbVxcXCIgZnhGbGV4PVxcXCI0NVxcXCI+Rmxvd3M8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBmeEZsZXggZnhMYXlvdXQ9XFxcImNvbHVtblxcXCIgZnhMYXlvdXRBbGlnbj1cXFwic3BhY2UtYXJvdW5kIHN0cmV0Y2hcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtYXQtZGlzcGxheS0xIHBhZC10b3Atc21cXFwiIGZ4RmxleD1cXFwiNTVcXFwiPjA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFkLXRvcC1zbVxcXCIgZnhGbGV4PVxcXCI0NVxcXCI+Q2VydGlmaWNhdGlvbnM8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XFxuICAgICAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXA+XFxuICAgICAgICAgICAgICAgIDxkaXYgZnhMYXlvdXQ9XFxcInJvd1xcXCIgY2xhc3M9XFxcInBhZC10b3AtbWQgcGFkLWJvdC1tZFxcXCI+PC9kaXY+XFxuICAgICAgICAgICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZS1ncm91cCBuYW1lPVxcXCJmZHMtYWRtaW5pc3RyYXRpb24tcGVyc3BlY3RpdmVcXFwiIGZ4TGF5b3V0PVxcXCJyb3dcXFwiIGNsYXNzPVxcXCJ0YWItdG9nZ2xlLWdyb3VwXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZSB2YWx1ZT1cXFwiZ2VuZXJhbFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhbFxcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZnhMYXlvdXQ9XFxcInJvd1xcXCIgY2xhc3M9XFxcInBhZC1sZWZ0LW1kXFxcIj48L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZSB2YWx1ZT1cXFwidXNlcnNcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJzXFxuICAgICAgICAgICAgICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBmeExheW91dD1cXFwicm93XFxcIiBjbGFzcz1cXFwicGFkLWxlZnQtbWRcXFwiPjwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIHZhbHVlPVxcXCJ3b3JrZmxvd1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgV29ya2Zsb3dcXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XFxuICAgICAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXA+XFxuICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cXFwibWQtdGl0bGVcXFwiPlVzYWdlPC9oMz5cXG4gICAgICAgICAgICAgICAgPHA+SFRNTDo8L3A+XFxuICAgICAgICAgICAgICAgIDxwcmUgbGFuZz1cXFwiaHRtbFxcXCI+XFxuICAgICAgPCFbQ0RBVEFbXFxuICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlLWdyb3VwIG5hbWU9XFxcImFsaWdubWVudFxcXCI+XFxuICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIHZhbHVlPVxcXCJsZWZ0XFxcIj5cXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmZvcm1hdF9hbGlnbl9sZWZ0PC9tYXQtaWNvbj5cXG4gICAgICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxcbiAgICAgICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZSB2YWx1ZT1cXFwiY2VudGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmZvcm1hdF9hbGlnbl9jZW50ZXI8L21hdC1pY29uPlxcbiAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XFxuICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIHZhbHVlPVxcXCJyaWdodFxcXCI+XFxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5mb3JtYXRfYWxpZ25fcmlnaHQ8L21hdC1pY29uPlxcbiAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XFxuICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIHZhbHVlPVxcXCJqdXN0aWZ5XFxcIj5cXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmZvcm1hdF9hbGlnbl9qdXN0aWZ5PC9tYXQtaWNvbj5cXG4gICAgICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxcbiAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cD5cXG4gICAgICAgIDxkaXYgZnhMYXlvdXQ9XFxcInJvd1xcXCIgY2xhc3M9XFxcInBhZC10b3AtbWQgcGFkLWJvdC1tZFxcXCI+PC9kaXY+XFxuICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAgbmFtZT1cXFwib25PZmZUb2dnbGVcXFwiIGNsYXNzPVxcXCJvbi1vZmYtdG9nZ2xlLWdyb3VwXFxcIj5cXG4gICAgICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGUgdmFsdWU9XFxcIm9uXFxcIiBbY2hlY2tlZF09XFxcInRydWVcXFwiPlxcbiAgICAgICAgICAgICAgICBPTlxcbiAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XFxuICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIHZhbHVlPVxcXCJvZmZcXFwiIGNsYXNzPVxcXCJvZmYtdG9nZ2xlXFxcIj5cXG4gICAgICAgICAgICAgICAgT0ZGXFxuICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cXG4gICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXA+XFxuICAgICAgICA8ZGl2IGZ4TGF5b3V0PVxcXCJyb3dcXFwiIGNsYXNzPVxcXCJwYWQtdG9wLW1kIHBhZC1ib3QtbWRcXFwiPjwvZGl2PlxcbiAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlLWdyb3VwIGZ4TGF5b3V0PVxcXCJyb3dcXFwiIGZ4TGF5b3V0QWxpZ249XFxcInNwYWNlLWJldHdlZW4gY2VudGVyXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVxcXCJleHBhbnNpb24tcGFuZWwtZmlsdGVyLXRvZ2dsZS1ncm91cFxcXCIgbXVsdGlwbGU+XFxuICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlPlxcbiAgICAgICAgICAgICAgICA8ZGl2IGZ4RmxleCBmeExheW91dD1cXFwiY29sdW1uXFxcIiBmeExheW91dEFsaWduPVxcXCJzcGFjZS1hcm91bmQgc3RyZXRjaFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtYXQtZGlzcGxheS0xIHBhZC10b3Atc21cXFwiIGZ4RmxleD1cXFwiNTVcXFwiPjM0PC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYWQtdG9wLXNtXFxcIiBmeEZsZXg9XFxcIjQ1XFxcIj5Bc3NldHM8L2Rpdj5cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cXG4gICAgICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGU+XFxuICAgICAgICAgICAgICAgIDxkaXYgZnhGbGV4IGZ4TGF5b3V0PVxcXCJjb2x1bW5cXFwiIGZ4TGF5b3V0QWxpZ249XFxcInNwYWNlLWFyb3VuZCBzdHJldGNoXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1hdC1kaXNwbGF5LTEgcGFkLXRvcC1zbVxcXCIgZnhGbGV4PVxcXCI1NVxcXCI+MzAwPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYWQtdG9wLXNtXFxcIiBmeEZsZXg9XFxcIjQ1XFxcIj5FeHRlbnNpb25zPC9kaXY+XFxuICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XFxuICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlPlxcbiAgICAgICAgICAgICAgICA8ZGl2IGZ4RmxleCBmeExheW91dD1cXFwiY29sdW1uXFxcIiBmeExheW91dEFsaWduPVxcXCJzcGFjZS1hcm91bmQgc3RyZXRjaFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtYXQtZGlzcGxheS0xIHBhZC10b3Atc21cXFwiIGZ4RmxleD1cXFwiNTVcXFwiPjUwMDA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhZC10b3Atc21cXFwiIGZ4RmxleD1cXFwiNDVcXFwiPkZsb3dzPC9kaXY+XFxuICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XFxuICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlPlxcbiAgICAgICAgICAgICAgICA8ZGl2IGZ4RmxleCBmeExheW91dD1cXFwiY29sdW1uXFxcIiBmeExheW91dEFsaWduPVxcXCJzcGFjZS1hcm91bmQgc3RyZXRjaFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtYXQtZGlzcGxheS0xIHBhZC10b3Atc21cXFwiIGZ4RmxleD1cXFwiNTVcXFwiPjA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhZC10b3Atc21cXFwiIGZ4RmxleD1cXFwiNDVcXFwiPkNlcnRpZmljYXRpb25zPC9kaXY+XFxuICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XFxuICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlLWdyb3VwPlxcbiAgICAgICAgPGRpdiBmeExheW91dD1cXFwicm93XFxcIiBjbGFzcz1cXFwicGFkLXRvcC1tZCBwYWQtYm90LW1kXFxcIj48L2Rpdj5cXG4gICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZS1ncm91cCBuYW1lPVxcXCJmZHMtYWRtaW5pc3RyYXRpb24tcGVyc3BlY3RpdmVcXFwiIGZ4TGF5b3V0PVxcXCJyb3dcXFwiIGNsYXNzPVxcXCJ0YWItdG9nZ2xlLWdyb3VwXFxcIj5cXG4gICAgICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGUgdmFsdWU9XFxcImdlbmVyYWxcXFwiPlxcbiAgICAgICAgICAgICAgICBnZW5lcmFsXFxuICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cXG4gICAgICAgICAgICA8ZGl2IGZ4TGF5b3V0PVxcXCJyb3dcXFwiIGNsYXNzPVxcXCJwYWQtbGVmdC1tZFxcXCI+PC9kaXY+XFxuICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIHZhbHVlPVxcXCJ1c2Vyc1xcXCI+XFxuICAgICAgICAgICAgICAgIFVzZXJzXFxuICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cXG4gICAgICAgICAgICA8ZGl2IGZ4TGF5b3V0PVxcXCJyb3dcXFwiIGNsYXNzPVxcXCJwYWQtbGVmdC1tZFxcXCI+PC9kaXY+XFxuICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIHZhbHVlPVxcXCJ3b3JrZmxvd1xcXCI+XFxuICAgICAgICAgICAgICAgIFdvcmtmbG93XFxuICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cXG4gICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXA+XFxuICAgICAgICBdXT5cXG4gICAgICA8L3ByZT5cXG4gICAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICA8L21hdC1jYXJkPlxcbiAgICAgICAgPG1hdC1jYXJkPlxcbiAgICAgICAgICAgIDxtYXQtY2FyZC10aXRsZSBjbGFzcz1cXFwicGFkLWJvdHRvbS1zbVxcXCIgaWQ9XFxcIklucHV0XFxcIj5JbnB1dCA8bWF0LWljb24gY2xhc3M9XFxcImxpbmstdG8tY29tcG9uZW50XFxcIiByb3V0ZXJMaW5rPVxcXCIvXFxcIiBmcmFnbWVudD1cXFwiSW5wdXRcXFwiPmxpbms8L21hdC1pY29uPjwvbWF0LWNhcmQtdGl0bGU+XFxuICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICAgICAgICAgIDxmb3JtPlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBsYXlvdXQ9XFxcInJvd1xcXCIgbGF5b3V0LW1hcmdpbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgZmxvYXRMYWJlbD1cXFwiYWx3YXlzXFxcIiBmbG9hdFBsYWNlaG9sZGVyPVxcXCJhbHdheXNcXFwiIGZsZXg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cXFwiQ29tcGFueSAoZGlzYWJsZWQpXFxcIiBkaXNhYmxlZCB2YWx1ZT1cXFwiR29vZ2xlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGxheW91dD1cXFwicm93XFxcIiBsYXlvdXQtbWFyZ2luPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBmbG9hdExhYmVsPVxcXCJhbHdheXNcXFwiIGZsb2F0UGxhY2Vob2xkZXI9XFxcImFsd2F5c1xcXCIgZmxleD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IGRpc2FibGVkIHBsYWNlaG9sZGVyPVxcXCJGaXJzdCBuYW1lXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBmbG9hdExhYmVsPVxcXCJhbHdheXNcXFwiIGZsZXg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cXFwiTG9uZyBMYXN0IE5hbWUgVGhhdCBXaWxsIEJlIFRydW5jYXRlZFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBsYXlvdXQ9XFxcInJvd1xcXCIgbGF5b3V0LW1hcmdpbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZsZXggZnhMYXlvdXRBbGlnbj1cXFwic3RhcnQgY2VudGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGZsb2F0TGFiZWw9XFxcImFsd2F5c1xcXCIgZmxleD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cXFwiQnV0dG9uIEFkZG9uIHdpdGggZHJvcGRvd25cXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVxcXCJpbnB1dC1idXR0b25cXFwiIGNvbG9yPVxcXCJmZHMtcmVndWxhclxcXCIgbWF0LXJhaXNlZC1idXR0b25cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVxcXCJpbnB1dEJ1dHRvbkRyb3Bkb3duQWRkb25NZW51XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdDxpIGNsYXNzPVxcXCJmYSBmYS1jYXJldC1kb3duXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCI+PC9pPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1tZW51IHhQb3NpdGlvbj1cXFwiYmVmb3JlXFxcIiAjaW5wdXRCdXR0b25Ecm9wZG93bkFkZG9uTWVudT1cXFwibWF0TWVudVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvdmVybGFwVHJpZ2dlcl09XFxcImZhbHNlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbT4gUmVmcmVzaDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtPiBTZXR0aW5nczwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtPiBIZWxwPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gZGlzYWJsZWQ+IFNpZ24gT3V0PC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW1lbnU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBmbGV4IGZ4TGF5b3V0QWxpZ249XFxcInN0YXJ0IGNlbnRlclxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBmbG9hdExhYmVsPVxcXCJhbHdheXNcXFwiIGZsb2F0UGxhY2Vob2xkZXI9XFxcImFsd2F5c1xcXCIgZmxleD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cXFwiQnV0dG9uIEFkZG9uXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cXFwiaW5wdXQtYnV0dG9uXFxcIiBjb2xvcj1cXFwiZmRzLXJlZ3VsYXJcXFwiIG1hdC1yYWlzZWQtYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGxheW91dD1cXFwicm93XFxcIiBsYXlvdXQtbWFyZ2luPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZmxleCBmeExheW91dEFsaWduPVxcXCJzdGFydCBjZW50ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgZmxvYXRMYWJlbD1cXFwiYWx3YXlzXFxcIiBmbG9hdFBsYWNlaG9sZGVyPVxcXCJhbHdheXNcXFwiIGZsZXg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZGlzYWJsZWQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XFxcIkJ1dHRvbiBBZGRvbiB3aXRoIGRyb3Bkb3duXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBkaXNhYmxlZCBjbGFzcz1cXFwiaW5wdXQtYnV0dG9uXFxcIiBjb2xvcj1cXFwiZmRzLXJlZ3VsYXJcXFwiIG1hdC1yYWlzZWQtYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0PGkgY2xhc3M9XFxcImZhIGZhLWNhcmV0LWRvd25cXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIj48L2k+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZmxleCBmeExheW91dEFsaWduPVxcXCJzdGFydCBjZW50ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgZmxvYXRMYWJlbD1cXFwiYWx3YXlzXFxcIiBmbG9hdFBsYWNlaG9sZGVyPVxcXCJhbHdheXNcXFwiIGZsZXg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZGlzYWJsZWQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XFxcIkJ1dHRvbiBBZGRvblxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gZGlzYWJsZWQgY2xhc3M9XFxcImlucHV0LWJ1dHRvblxcXCIgY29sb3I9XFxcImZkcy1yZWd1bGFyXFxcIiBtYXQtcmFpc2VkLWJ1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlYXJjaFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBsYXlvdXQ9XFxcInJvd1xcXCIgbGF5b3V0LW1hcmdpbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgZmxvYXRMYWJlbD1cXFwiYWx3YXlzXFxcIiBmbGV4PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XFxcIkFkZHJlc3NcXFwiIHZhbHVlPVxcXCIxNjAwIEFtcGhpdGhlYXRyZSBQa3dheVxcXCI+PC90ZXh0YXJlYT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGxheW91dD1cXFwicm93XFxcIiBsYXlvdXQtbWFyZ2luPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBmbG9hdExhYmVsPVxcXCJhbHdheXNcXFwiIGZsb2F0UGxhY2Vob2xkZXI9XFxcImFsd2F5c1xcXCIgZmxleD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGRpc2FibGVkIHZhbHVlPVxcXCJBZGRyZXNzIDIgVmFsdWVcXFwiIG1hdElucHV0IHBsYWNlaG9sZGVyPVxcXCJBZGRyZXNzIDJcXFwiPjwvdGV4dGFyZWE+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBsYXlvdXQ9XFxcInJvd1xcXCIgbGF5b3V0LW1hcmdpbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgZmxvYXRMYWJlbD1cXFwiYWx3YXlzXFxcIiBmbG9hdFBsYWNlaG9sZGVyPVxcXCJhbHdheXNcXFwiIGZsZXg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cXFwiQ2l0eVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgZmxvYXRMYWJlbD1cXFwiYWx3YXlzXFxcIiBmbG9hdFBsYWNlaG9sZGVyPVxcXCJhbHdheXNcXFwiIGZsZXg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cXFwiU3RhdGVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGZsb2F0TGFiZWw9XFxcImFsd2F5c1xcXCIgZmxvYXRQbGFjZWhvbGRlcj1cXFwiYWx3YXlzXFxcIiBmbGV4PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgI3Bvc3RhbENvZGUgbWF4bGVuZ3RoPVxcXCI1XFxcIiBwbGFjZWhvbGRlcj1cXFwiUG9zdGFsIENvZGVcXFwiIHZhbHVlPVxcXCI5NDA0M1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaGludCBhbGlnbj1cXFwiZW5kXFxcIj57e3Bvc3RhbENvZGUudmFsdWUubGVuZ3RofX0gLyA1PC9tYXQtaGludD5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgIDwvZm9ybT5cXG4gICAgICAgICAgICAgICAgPGgzIGNsYXNzPVxcXCJtZC10aXRsZVxcXCI+VXNhZ2U8L2gzPlxcbiAgICAgICAgICAgICAgICA8cD5IVE1MOjwvcD5cXG4gICAgICAgICAgICAgICAgPHByZSBsYW5nPVxcXCJodG1sXFxcIj5cXG4gICAgPCFbQ0RBVEFbXFxuICAgICAgICA8IS0tIElucHV0cyAtLT5cXG4gICAgICAgIDxmb3JtPlxcbiAgICAgICAgICAgIDxkaXYgbGF5b3V0PVxcXCJyb3dcXFwiIGxheW91dC1tYXJnaW4+XFxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBmbG9hdExhYmVsPVxcXCJhbHdheXNcXFwiIGZsb2F0UGxhY2Vob2xkZXI9XFxcImFsd2F5c1xcXCIgZmxleD5cXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cXFwiQ29tcGFueSAoZGlzYWJsZWQpXFxcIiBkaXNhYmxlZCB2YWx1ZT1cXFwiR29vZ2xlXFxcIj5cXG4gICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8ZGl2IGxheW91dD1cXFwicm93XFxcIiBsYXlvdXQtbWFyZ2luPlxcbiAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgZmxvYXRMYWJlbD1cXFwiYWx3YXlzXFxcIiBmbG9hdFBsYWNlaG9sZGVyPVxcXCJhbHdheXNcXFwiIGZsZXg+XFxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgZGlzYWJsZWQgcGxhY2Vob2xkZXI9XFxcIkZpcnN0IG5hbWVcXFwiPlxcbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxcbiAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgZmxvYXRMYWJlbD1cXFwiYWx3YXlzXFxcIiBmbGV4PlxcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHBsYWNlaG9sZGVyPVxcXCJMb25nIExhc3QgTmFtZSBUaGF0IFdpbGwgQmUgVHJ1bmNhdGVkXFxcIj5cXG4gICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8ZGl2IGxheW91dD1cXFwicm93XFxcIiBsYXlvdXQtbWFyZ2luPlxcbiAgICAgICAgICAgICAgICA8ZGl2IGZsZXggZnhMYXlvdXRBbGlnbj1cXFwic3RhcnQgY2VudGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBmbG9hdExhYmVsPVxcXCJhbHdheXNcXFwiIGZsZXg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHBsYWNlaG9sZGVyPVxcXCJCdXR0b24gQWRkb24gd2l0aCBkcm9wZG93blxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cXFwiaW5wdXQtYnV0dG9uXFxcIiBjb2xvcj1cXFwiZmRzLXJlZ3VsYXJcXFwiIG1hdC1yYWlzZWQtYnV0dG9uXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRNZW51VHJpZ2dlckZvcl09XFxcImlucHV0QnV0dG9uRHJvcGRvd25BZGRvbk1lbnVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdDxpIGNsYXNzPVxcXCJmYSBmYS1jYXJldC1kb3duXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCI+PC9pPlxcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LW1lbnUgeFBvc2l0aW9uPVxcXCJiZWZvcmVcXFwiICNpbnB1dEJ1dHRvbkRyb3Bkb3duQWRkb25NZW51PVxcXCJtYXRNZW51XFxcIiBbb3ZlcmxhcFRyaWdnZXJdPVxcXCJmYWxzZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtPiBSZWZyZXNoIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbT4gU2V0dGluZ3MgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtPiBIZWxwIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSBkaXNhYmxlZD4gU2lnbiBPdXQgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICA8L21hdC1tZW51PlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgPGRpdiBmbGV4IGZ4TGF5b3V0QWxpZ249XFxcInN0YXJ0IGNlbnRlclxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgZmxvYXRMYWJlbD1cXFwiYWx3YXlzXFxcIiBmbG9hdFBsYWNlaG9sZGVyPVxcXCJhbHdheXNcXFwiIGZsZXg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHBsYWNlaG9sZGVyPVxcXCJCdXR0b24gQWRkb25cXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XFxcImlucHV0LWJ1dHRvblxcXCIgY29sb3I9XFxcImZkcy1yZWd1bGFyXFxcIiBtYXQtcmFpc2VkLWJ1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICBTZWFyY2hcXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8ZGl2IGxheW91dD1cXFwicm93XFxcIiBsYXlvdXQtbWFyZ2luPlxcbiAgICAgICAgICAgICAgICA8ZGl2IGZsZXggZnhMYXlvdXRBbGlnbj1cXFwic3RhcnQgY2VudGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBmbG9hdExhYmVsPVxcXCJhbHdheXNcXFwiIGZsb2F0UGxhY2Vob2xkZXI9XFxcImFsd2F5c1xcXCIgZmxleD5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZGlzYWJsZWQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XFxcIkJ1dHRvbiBBZGRvbiB3aXRoIGRyb3Bkb3duXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGRpc2FibGVkIGNsYXNzPVxcXCJpbnB1dC1idXR0b25cXFwiIGNvbG9yPVxcXCJmZHMtcmVndWxhclxcXCIgbWF0LXJhaXNlZC1idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0PGkgY2xhc3M9XFxcImZhIGZhLWNhcmV0LWRvd25cXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIj48L2k+XFxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgIDxkaXYgZmxleCBmeExheW91dEFsaWduPVxcXCJzdGFydCBjZW50ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGZsb2F0TGFiZWw9XFxcImFsd2F5c1xcXCIgZmxvYXRQbGFjZWhvbGRlcj1cXFwiYWx3YXlzXFxcIiBmbGV4PlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBkaXNhYmxlZCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cXFwiQnV0dG9uIEFkZG9uXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGRpc2FibGVkIGNsYXNzPVxcXCJpbnB1dC1idXR0b25cXFwiIGNvbG9yPVxcXCJmZHMtcmVndWxhclxcXCIgbWF0LXJhaXNlZC1idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoXFxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPGRpdiBsYXlvdXQ9XFxcInJvd1xcXCIgbGF5b3V0LW1hcmdpbj5cXG4gICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGZsb2F0TGFiZWw9XFxcImFsd2F5c1xcXCIgZmxleD5cXG4gICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cXFwiQWRkcmVzc1xcXCIgdmFsdWU9XFxcIjE2MDAgQW1waGl0aGVhdHJlIFBrd2F5XFxcIj48L3RleHRhcmVhPlxcbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDxkaXYgbGF5b3V0PVxcXCJyb3dcXFwiIGxheW91dC1tYXJnaW4+XFxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBmbG9hdExhYmVsPVxcXCJhbHdheXNcXFwiIGZsb2F0UGxhY2Vob2xkZXI9XFxcImFsd2F5c1xcXCIgZmxleD5cXG4gICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBkaXNhYmxlZCB2YWx1ZT1cXFwiQWRkcmVzcyAyIFZhbHVlXFxcIiBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cXFwiQWRkcmVzcyAyXFxcIj48L3RleHRhcmVhPlxcbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDxkaXYgbGF5b3V0PVxcXCJyb3dcXFwiIGxheW91dC1tYXJnaW4+XFxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBmbG9hdExhYmVsPVxcXCJhbHdheXNcXFwiIGZsb2F0UGxhY2Vob2xkZXI9XFxcImFsd2F5c1xcXCIgZmxleD5cXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cXFwiQ2l0eVxcXCI+XFxuICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XFxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBmbG9hdExhYmVsPVxcXCJhbHdheXNcXFwiIGZsb2F0UGxhY2Vob2xkZXI9XFxcImFsd2F5c1xcXCIgZmxleD5cXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cXFwiU3RhdGVcXFwiPlxcbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxcbiAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgZmxvYXRMYWJlbD1cXFwiYWx3YXlzXFxcIiBmbG9hdFBsYWNlaG9sZGVyPVxcXCJhbHdheXNcXFwiIGZsZXg+XFxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgI3Bvc3RhbENvZGUgbWF4bGVuZ3RoPVxcXCI1XFxcIiBwbGFjZWhvbGRlcj1cXFwiUG9zdGFsIENvZGVcXFwiIHZhbHVlPVxcXCI5NDA0M1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LWhpbnQgYWxpZ249XFxcImVuZFxcXCI+e3twb3N0YWxDb2RlLnZhbHVlLmxlbmd0aH19IC8gNTwvbWF0LWhpbnQ+XFxuICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L2Zvcm0+XFxuICAgIF1dPlxcbiAgICA8L3ByZT5cXG4gICAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICA8L21hdC1jYXJkPlxcbiAgICAgICAgPG1hdC1jYXJkPlxcbiAgICAgICAgICAgIDxtYXQtY2FyZC10aXRsZSBjbGFzcz1cXFwicGFkLWJvdHRvbS1zbVxcXCIgaWQ9XFxcIlRhYnNcXFwiPlRhYnMgPG1hdC1pY29uIGNsYXNzPVxcXCJsaW5rLXRvLWNvbXBvbmVudFxcXCIgcm91dGVyTGluaz1cXFwiL1xcXCIgZnJhZ21lbnQ9XFxcIlRhYnNcXFwiPmxpbms8L21hdC1pY29uPjwvbWF0LWNhcmQtdGl0bGU+XFxuICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICAgICAgICAgIDxtYXQtdGFiLWdyb3VwIGR5bmFtaWNIZWlnaHQgY29sb3I9XFxcImFjY2VudFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LXRhYj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbWF0LXRhYi1sYWJlbD5PbmU8L25nLXRlbXBsYXRlPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cXFwibWQtdGl0bGVcXFwiPkZpcnN0IHRhYiBjb250ZW50PC9oMz5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8cD5QbGFpZCBlY2hvIHBhcmsga25hdXNnYWFyZCBub3JtY29yZSBmcmFuemVuIGNyb251dC4gUGlja2xlZCBodW1ibGVicmFnIHRvZnUgaG9vZGllLCB1bWFtaVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWx2aWEgZmFybS10by10YWJsZSBzY2hsaXR6IHRyeS1oYXJkIGZvb2QgdHJ1Y2sga25hdXNnYWFyZCBwYWJzdC4gWXVjY2llIHBvcnRsYW5kIGplYW5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRzLCBhdXRoZW50aWMgbWl4dGFwZSB3YWlzdGNvYXQgZ2VudHJpZnkgYmx1ZSBib3R0bGUuIEZpeGllIGtpY2tzdGFydGVyIGNodXJjaC1rZXkgc21hbGxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2ggc2VpdGFuLCBzaGFiYnkgY2hpYyB2ZWdhbiBsaXN0aWNsZSBiZWZvcmUgdGhleSBzb2xkIG91dC4gSGFtbW9jayByYXcgZGVuaW0gZmxhbm5lbFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3VzbGVkIHNlaXRhbiB5b3UgcHJvYmFibHkgaGF2ZW4ndCBoZWFyZCBvZiB0aGVtLiBUcnVzdCBmdW5kIG1hbiBidW4gcHVnLCBraWNrc3RhcnRlclxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnRpc2FuIHNlbHZhZ2UgbGV0dGVycHJlc3MgY29ybmhvbGUgdG90ZSBiYWcgYnV0Y2hlciBsb2Nhdm9yZS4gQWZmb2dhdG8gdHJ5LWhhcmRcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2lja3N0YXJ0ZXIgc2VpdGFuLCBESVkgcGlja2xlZCBoZWxsYSBnb2RhcmQgcG9yayBiZWxseSBmb3VyIGxva28gdWdoLjwvcD5cXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LXRhYj5cXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtdGFiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBtYXQtdGFiLWxhYmVsPlR3bzwvbmctdGVtcGxhdGU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVxcXCJtZC10aXRsZVxcXCI+U2Vjb25kIHRhYiBjb250ZW50PC9oMz5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8cD5IYXNodGFnIGRpc3RpbGxlcnkgc2thdGVib2FyZCBtYW4gYnVuIGdvY2h1amFuZywgc2FsdmlhIG1hbiBicmFpZCBhcnQgcGFydHkgbWVnZ2luZ3MgaGVpcmxvb21cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2l0c2NoIGZhcm0tdG8tdGFibGUuIEZyYW56ZW4gYmVhcmQgZmluZ2Vyc3RhY2hlIGdlbnRyaWZ5LCBoZWlybG9vbSBwb3J0bGFuZCBlbm51aSBYT1hPXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pY3JvZG9zaW5nIGtpdHNjaCBwbGFpZC4gQ2hpY2hhcnJvbmVzIGJ1c2h3aWNrIGNoaWEsIGJhbmggbWkgaXJvbnkgdGF0dG9vZWQgaGFtbW9jayBidXRjaGVyXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWJieSBjaGljIHRheGlkZXJteSBzZW1pb3RpY3MgbWFyZmEgcG9zdC1pcm9uaWMuIEJsdWUgYm90dGxlIGtlZmZpeWVoIGZhcm0tdG8tdGFibGUgZW5udWksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW1icmF5IHBpdGNoZm9yayBhcnQgcGFydHkgcGludGVyZXN0IGFydGlzYW4gcG9wLXVwLiBFdHN5IGJhbmpvIG1hcmZhLCBibHVlIGJvdHRsZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrb21idWNoYSBjcnVjaWZpeCBYT1hPIHRvdXNsZWQgYmVhcmQuIFRpbGRlIGRpc3J1cHQga2FsZSBjaGlwcyBiaWN5Y2xlIHJpZ2h0cyBza2F0ZWJvYXJkXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc3RlciBjbGVhbnNlIGhlbGxhIHNob3JlZGl0Y2gsIG1lZGl0YXRpb24gcmV0cm8gc2hhYmJ5IGNoaWMgdmljZSBoZWlybG9vbS4gRXRzeSBsaXN0aWNsZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWNlIGFjdHVhbGx5LCBpUGhvbmUgY2hpYSBob29kaWUgZm91ciBsb2tvLjwvcD5cXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LXRhYj5cXG4gICAgICAgICAgICAgICAgPC9tYXQtdGFiLWdyb3VwPlxcbiAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XFxcIm1kLXRpdGxlXFxcIj5Vc2FnZTwvaDM+XFxuICAgICAgICAgICAgICAgIDxwPkhUTUw6PC9wPlxcbiAgICAgICAgICAgICAgICA8cHJlIGxhbmc9XFxcImh0bWxcXFwiPlxcbiAgICAgIDwhW0NEQVRBW1xcbiAgICAgICAgPG1hdC10YWItZ3JvdXAgZHluYW1pY0hlaWdodCBjb2xvcj1cXFwiYWNjZW50XFxcIj5cXG4gICAgICAgICAgPG1hdC10YWI+XFxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG1hdC10YWItbGFiZWw+Rmlyc3QgdGFiIGNvbnRlbnQ8L25nLXRlbXBsYXRlPlxcbiAgICAgICAgICAgIDxoMT5GaXJzdCBjb250ZW50PC9oMT5cXG4gICAgICAgICAgICA8cD4uLi48L3A+XFxuICAgICAgICAgIDwvbWF0LXRhYj5cXG4gICAgICAgICAgPG1hdC10YWI+XFxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG1hdC10YWItbGFiZWw+U2Vjb25kIHRhYiBjb250ZW50PC9uZy10ZW1wbGF0ZT5cXG4gICAgICAgICAgICA8aDE+U2Vjb25kIHRhYiBjb250ZW50PC9oMT5cXG4gICAgICAgICAgICA8cD4uLi48L3A+XFxuICAgICAgICAgIDwvbWF0LXRhYj5cXG4gICAgICAgIDwvbWF0LXRhYi1ncm91cD5cXG4gICAgICAgIF1dPlxcbiAgICAgIDwvcHJlPlxcbiAgICAgICAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cXG4gICAgICAgIDwvbWF0LWNhcmQ+XFxuICAgICAgICA8bWF0LWNhcmQ+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLXRpdGxlIGNsYXNzPVxcXCJwYWQtYm90dG9tLXNtXFxcIiBpZD1cXFwiU3RlcHBlclxcXCI+U3RlcHBlciA8bWF0LWljb24gY2xhc3M9XFxcImxpbmstdG8tY29tcG9uZW50XFxcIiByb3V0ZXJMaW5rPVxcXCIvXFxcIiBmcmFnbWVudD1cXFwiU3RlcHBlclxcXCI+bGluazwvbWF0LWljb24+PC9tYXQtY2FyZC10aXRsZT5cXG4gICAgICAgICAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cXG4gICAgICAgICAgICA8bWF0LWNhcmQtY29udGVudD5cXG4gICAgICAgICAgICAgICAgPHRkLXN0ZXBzIG1vZGU9XFxcInZlcnRpY2FsXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDx0ZC1zdGVwIGxhYmVsPVxcXCJWZXJzaW9uIDFcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJsYWJlbD1cXFwiYnkgQWRtaW5cXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWN0aXZlXT1cXFwidHJ1ZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBmeExheW91dD1cXFwiY29sdW1uXFxcIiBmeExheW91dEFsaWduPVxcXCJzcGFjZS1iZXR3ZWVuIHN0cmV0Y2hcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZ4TGF5b3V0PVxcXCJyb3dcXFwiIGNsYXNzPVxcXCJtZC1ib2R5LTJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWVudHMgZ28gaGVyZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBmeExheW91dD1cXFwicm93XFxcIiBjbGFzcz1cXFwibWF0LWNhcHRpb25cXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW4gaG91ciBhZ29cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICA8L3RkLXN0ZXA+XFxuICAgICAgICAgICAgICAgICAgICA8dGQtc3RlcCBsYWJlbD1cXFwiVmVyc2lvbiAyXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VibGFiZWw9XFxcImJ5IEFkbWluXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZ4TGF5b3V0PVxcXCJjb2x1bW5cXFwiIGZ4TGF5b3V0QWxpZ249XFxcInNwYWNlLWJldHdlZW4gc3RyZXRjaFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZnhMYXlvdXQ9XFxcInJvd1xcXCIgY2xhc3M9XFxcIm1kLWJvZHktMlxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tZW50cyBnbyBoZXJlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZ4TGF5b3V0PVxcXCJyb3dcXFwiIGNsYXNzPVxcXCJtYXQtY2FwdGlvblxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBIGRheSBhZ29cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICA8L3RkLXN0ZXA+XFxuICAgICAgICAgICAgICAgIDwvdGQtc3RlcHM+XFxuICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cXFwibWQtdGl0bGVcXFwiPlVzYWdlPC9oMz5cXG4gICAgICAgICAgICAgICAgPHA+SFRNTDo8L3A+XFxuICAgICAgICAgICAgICAgIDxwcmUgbGFuZz1cXFwiaHRtbFxcXCI+XFxuICAgICAgPCFbQ0RBVEFbXFxuICAgICAgICA8dGQtc3RlcHMgbW9kZT1cXFwidmVydGljYWxcXFwiPlxcbiAgICAgICAgICAgIDx0ZC1zdGVwIGxhYmVsPVxcXCJWZXJzaW9uIDFcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgc3VibGFiZWw9XFxcImJ5IEFkbWluXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgIFthY3RpdmVdPVxcXCJ0cnVlXFxcIj5cXG4gICAgICAgICAgICAgICAgPGRpdiBmeExheW91dD1cXFwiY29sdW1uXFxcIiBmeExheW91dEFsaWduPVxcXCJzcGFjZS1iZXR3ZWVuIHN0cmV0Y2hcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBmeExheW91dD1cXFwicm93XFxcIiBjbGFzcz1cXFwibWQtYm9keS0yXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiBnb2VzIGhlcmVcXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBmeExheW91dD1cXFwicm93XFxcIiBjbGFzcz1cXFwibWF0LWNhcHRpb25cXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIEFuIGhvdXIgYWdvXFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPC90ZC1zdGVwPlxcbiAgICAgICAgICAgIDx0ZC1zdGVwIGxhYmVsPVxcXCJWZXJzaW9uIDJcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgc3VibGFiZWw9XFxcImJ5IEFkbWluXFxcIj5cXG4gICAgICAgICAgICAgICAgPGRpdiBmeExheW91dD1cXFwiY29sdW1uXFxcIiBmeExheW91dEFsaWduPVxcXCJzcGFjZS1iZXR3ZWVuIHN0cmV0Y2hcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBmeExheW91dD1cXFwicm93XFxcIiBjbGFzcz1cXFwibWQtYm9keS0yXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiBnb2VzIGhlcmVcXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBmeExheW91dD1cXFwicm93XFxcIiBjbGFzcz1cXFwibWF0LWNhcHRpb25cXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIEEgZGF5IGFnb1xcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDwvdGQtc3RlcD5cXG4gICAgICAgIDwvdGQtc3RlcHM+XFxuICAgICAgICBdXT5cXG4gICAgICA8L3ByZT5cXG4gICAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICA8L21hdC1jYXJkPlxcbiAgICAgICAgPG1hdC1jYXJkPlxcbiAgICAgICAgICAgIDxtYXQtY2FyZC10aXRsZSBjbGFzcz1cXFwicGFkLWJvdHRvbS1zbVxcXCIgaWQ9XFxcIkF1dG9jb21wbGV0ZVxcXCI+QXV0b2NvbXBsZXRlIDxtYXQtaWNvbiBjbGFzcz1cXFwibGluay10by1jb21wb25lbnRcXFwiIHJvdXRlckxpbms9XFxcIi9cXFwiIGZyYWdtZW50PVxcXCJBdXRvY29tcGxldGVcXFwiPmxpbms8L21hdC1pY29uPjwvbWF0LWNhcmQtdGl0bGU+XFxuICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhZC10b3Atc21cXFwiIGxheW91dD1cXFwicm93XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBmbG9hdExhYmVsPVxcXCJhbHdheXNcXFwiIGZsZXg9XFxcIjUwXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XFxcIlN0YXRlXFxcIiBbbWF0QXV0b2NvbXBsZXRlXT1cXFwidGRBdXRvXFxcIiBbKG5nTW9kZWwpXT1cXFwiY3VycmVudFN0YXRlXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjbW9kZWxEaXI9XFxcIm5nTW9kZWxcXFwiIChuZ01vZGVsQ2hhbmdlKT1cXFwidGhpcy50ZFN0YXRlcyA9IGZpbHRlclN0YXRlcyhjdXJyZW50U3RhdGUpXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVxcXCJ0ZERpc2FibGVkXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XFxuICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwdXNoLXRvcFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gKGNsaWNrKT1cXFwibW9kZWxEaXIucmVzZXQoKVxcXCIgY2xhc3M9XFxcInRleHQtdXBwZXJcXFwiPlJlc2V0PC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gKGNsaWNrKT1cXFwiY3VycmVudFN0YXRlPSdDYWxpZm9ybmlhJ1xcXCIgY2xhc3M9XFxcInRleHQtdXBwZXJcXFwiPlNldCB2YWx1ZTwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIChjbGljayk9XFxcInRkRGlzYWJsZWQ9IXRkRGlzYWJsZWRcXFwiIGNsYXNzPVxcXCJ0ZXh0LXVwcGVyXFxcIj5Ub2dnbGUgZGlzYWJsZWQ8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlICN0ZEF1dG89XFxcIm1hdEF1dG9jb21wbGV0ZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XFxcImxldCBzdGF0ZSBvZiB0ZFN0YXRlc1xcXCIgW3ZhbHVlXT1cXFwic3RhdGUubmFtZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgc3RhdGUubmFtZSB9fTwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiZGVtby1zZWNvbmRhcnktdGV4dFxcXCI+ICh7e3N0YXRlLmNvZGV9fSkgPC9zcGFuPlxcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxcbiAgICAgICAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XFxuICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cXFwibWQtdGl0bGVcXFwiPlVzYWdlPC9oMz5cXG4gICAgICAgICAgICAgICAgPHA+SFRNTDo8L3A+XFxuICAgICAgICAgICAgICAgIDxwcmUgbGFuZz1cXFwiaHRtbFxcXCI+XFxuICAgICAgPCFbQ0RBVEFbXFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYWQtdG9wLXNtXFxcIiBsYXlvdXQ9XFxcInJvd1xcXCI+XFxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGZsb2F0TGFiZWw9XFxcImFsd2F5c1xcXCIgZmxleD1cXFwiNTBcXFwiPlxcbiAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XFxcIlN0YXRlXFxcIiBbbWF0QXV0b2NvbXBsZXRlXT1cXFwidGRBdXRvXFxcIiBbKG5nTW9kZWwpXT1cXFwiY3VycmVudFN0YXRlXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgI21vZGVsRGlyPVxcXCJuZ01vZGVsXFxcIiAobmdNb2RlbENoYW5nZSk9XFxcInRoaXMudGRTdGF0ZXMgPSBmaWx0ZXJTdGF0ZXMoY3VycmVudFN0YXRlKVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XFxcInRkRGlzYWJsZWRcXFwiPlxcbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcInB1c2gtdG9wXFxcIj5cXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gKGNsaWNrKT1cXFwibW9kZWxEaXIucmVzZXQoKVxcXCIgY2xhc3M9XFxcInRleHQtdXBwZXJcXFwiPlJlc2V0PC9idXR0b24+XFxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIChjbGljayk9XFxcImN1cnJlbnRTdGF0ZT0nQ2FsaWZvcm5pYSdcXFwiIGNsYXNzPVxcXCJ0ZXh0LXVwcGVyXFxcIj5TZXQgdmFsdWU8L2J1dHRvbj5cXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gKGNsaWNrKT1cXFwidGREaXNhYmxlZD0hdGREaXNhYmxlZFxcXCIgY2xhc3M9XFxcInRleHQtdXBwZXJcXFwiPlRvZ2dsZSBkaXNhYmxlZDwvYnV0dG9uPlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZSAjdGRBdXRvPVxcXCJtYXRBdXRvY29tcGxldGVcXFwiPlxcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cXFwibGV0IHN0YXRlIG9mIHRkU3RhdGVzXFxcIiBbdmFsdWVdPVxcXCJzdGF0ZS5uYW1lXFxcIj5cXG4gICAgICAgICAgICAgICAgPHNwYW4+eyB7IHN0YXRlLm5hbWUgfSB9PC9zcGFuPlxcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiZGVtby1zZWNvbmRhcnktdGV4dFxcXCI+ICh7IHtzdGF0ZS5jb2RlfSB9KSA8L3NwYW4+XFxuICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxcbiAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxcbiAgICAgICAgXV0+XFxuICAgICAgPC9wcmU+XFxuICAgICAgICAgICAgICAgIDxwPkphdmFzY3JpcHQ6PC9wPlxcbiAgICAgICAgICAgICAgICA8cHJlIGxhbmc9XFxcImphdmFzY3JpcHRcXFwiPlxcbiAgICAgIDwhW0NEQVRBW1xcbiAgICAgICAgdGhpcy5jdXJyZW50U3RhdGUgPSAnJztcXG4gICAgICAgIHRoaXMucmVhY3RpdmVTdGF0ZXMgPSAnJztcXG4gICAgICAgIHRoaXMudGRTdGF0ZXMgPSBbXTtcXG4gICAgICAgIHRoaXMudGREaXNhYmxlZCA9IGZhbHNlO1xcbiAgICAgICAgdGhpcy5zdGF0ZXMgPSBbXFxuICAgICAgICAgICAgeyBjb2RlOiAnQUwnLCBuYW1lOiAnQWxhYmFtYScgfSxcXG4gICAgICAgICAgICB7IGNvZGU6ICdBSycsIG5hbWU6ICdBbGFza2EnIH0sXFxuICAgICAgICAgICAgeyBjb2RlOiAnQVonLCBuYW1lOiAnQXJpem9uYScgfSxcXG4gICAgICAgICAgICB7IGNvZGU6ICdBUicsIG5hbWU6ICdBcmthbnNhcycgfSxcXG4gICAgICAgICAgICB7IGNvZGU6ICdDQScsIG5hbWU6ICdDYWxpZm9ybmlhJyB9LFxcbiAgICAgICAgICAgIHsgY29kZTogJ0NPJywgbmFtZTogJ0NvbG9yYWRvJyB9LFxcbiAgICAgICAgICAgIHsgY29kZTogJ0NUJywgbmFtZTogJ0Nvbm5lY3RpY3V0JyB9LFxcbiAgICAgICAgICAgIHsgY29kZTogJ0RFJywgbmFtZTogJ0RlbGF3YXJlJyB9LFxcbiAgICAgICAgICAgIHsgY29kZTogJ0ZMJywgbmFtZTogJ0Zsb3JpZGEnIH0sXFxuICAgICAgICAgICAgeyBjb2RlOiAnR0EnLCBuYW1lOiAnR2VvcmdpYScgfSxcXG4gICAgICAgICAgICB7IGNvZGU6ICdISScsIG5hbWU6ICdIYXdhaWknIH0sXFxuICAgICAgICAgICAgeyBjb2RlOiAnSUQnLCBuYW1lOiAnSWRhaG8nIH0sXFxuICAgICAgICAgICAgeyBjb2RlOiAnSUwnLCBuYW1lOiAnSWxsaW5vaXMnIH0sXFxuICAgICAgICAgICAgeyBjb2RlOiAnSU4nLCBuYW1lOiAnSW5kaWFuYScgfSxcXG4gICAgICAgICAgICB7IGNvZGU6ICdJQScsIG5hbWU6ICdJb3dhJyB9LFxcbiAgICAgICAgICAgIHsgY29kZTogJ0tTJywgbmFtZTogJ0thbnNhcycgfSxcXG4gICAgICAgICAgICB7IGNvZGU6ICdLWScsIG5hbWU6ICdLZW50dWNreScgfSxcXG4gICAgICAgICAgICB7IGNvZGU6ICdMQScsIG5hbWU6ICdMb3Vpc2lhbmEnIH0sXFxuICAgICAgICAgICAgeyBjb2RlOiAnTUUnLCBuYW1lOiAnTWFpbmUnIH0sXFxuICAgICAgICAgICAgeyBjb2RlOiAnTUQnLCBuYW1lOiAnTWFyeWxhbmQnIH0sXFxuICAgICAgICAgICAgeyBjb2RlOiAnTUEnLCBuYW1lOiAnTWFzc2FjaHVzZXR0cycgfSxcXG4gICAgICAgICAgICB7IGNvZGU6ICdNSScsIG5hbWU6ICdNaWNoaWdhbicgfSxcXG4gICAgICAgICAgICB7IGNvZGU6ICdNTicsIG5hbWU6ICdNaW5uZXNvdGEnIH0sXFxuICAgICAgICAgICAgeyBjb2RlOiAnTVMnLCBuYW1lOiAnTWlzc2lzc2lwcGknIH0sXFxuICAgICAgICAgICAgeyBjb2RlOiAnTU8nLCBuYW1lOiAnTWlzc291cmknIH0sXFxuICAgICAgICAgICAgeyBjb2RlOiAnTVQnLCBuYW1lOiAnTW9udGFuYScgfSxcXG4gICAgICAgICAgICB7IGNvZGU6ICdORScsIG5hbWU6ICdOZWJyYXNrYScgfSxcXG4gICAgICAgICAgICB7IGNvZGU6ICdOVicsIG5hbWU6ICdOZXZhZGEnIH0sXFxuICAgICAgICAgICAgeyBjb2RlOiAnTkgnLCBuYW1lOiAnTmV3IEhhbXBzaGlyZScgfSxcXG4gICAgICAgICAgICB7IGNvZGU6ICdOSicsIG5hbWU6ICdOZXcgSmVyc2V5JyB9LFxcbiAgICAgICAgICAgIHsgY29kZTogJ05NJywgbmFtZTogJ05ldyBNZXhpY28nIH0sXFxuICAgICAgICAgICAgeyBjb2RlOiAnTlknLCBuYW1lOiAnTmV3IFlvcmsnIH0sXFxuICAgICAgICAgICAgeyBjb2RlOiAnTkMnLCBuYW1lOiAnTm9ydGggQ2Fyb2xpbmEnIH0sXFxuICAgICAgICAgICAgeyBjb2RlOiAnTkQnLCBuYW1lOiAnTm9ydGggRGFrb3RhJyB9LFxcbiAgICAgICAgICAgIHsgY29kZTogJ09IJywgbmFtZTogJ09oaW8nIH0sXFxuICAgICAgICAgICAgeyBjb2RlOiAnT0snLCBuYW1lOiAnT2tsYWhvbWEnIH0sXFxuICAgICAgICAgICAgeyBjb2RlOiAnT1InLCBuYW1lOiAnT3JlZ29uJyB9LFxcbiAgICAgICAgICAgIHsgY29kZTogJ1BBJywgbmFtZTogJ1Blbm5zeWx2YW5pYScgfSxcXG4gICAgICAgICAgICB7IGNvZGU6ICdSSScsIG5hbWU6ICdSaG9kZSBJc2xhbmQnIH0sXFxuICAgICAgICAgICAgeyBjb2RlOiAnU0MnLCBuYW1lOiAnU291dGggQ2Fyb2xpbmEnIH0sXFxuICAgICAgICAgICAgeyBjb2RlOiAnU0QnLCBuYW1lOiAnU291dGggRGFrb3RhJyB9LFxcbiAgICAgICAgICAgIHsgY29kZTogJ1ROJywgbmFtZTogJ1Rlbm5lc3NlZScgfSxcXG4gICAgICAgICAgICB7IGNvZGU6ICdUWCcsIG5hbWU6ICdUZXhhcycgfSxcXG4gICAgICAgICAgICB7IGNvZGU6ICdVVCcsIG5hbWU6ICdVdGFoJyB9LFxcbiAgICAgICAgICAgIHsgY29kZTogJ1ZUJywgbmFtZTogJ1Zlcm1vbnQnIH0sXFxuICAgICAgICAgICAgeyBjb2RlOiAnVkEnLCBuYW1lOiAnVmlyZ2luaWEnIH0sXFxuICAgICAgICAgICAgeyBjb2RlOiAnV0EnLCBuYW1lOiAnV2FzaGluZ3RvbicgfSxcXG4gICAgICAgICAgICB7IGNvZGU6ICdXVicsIG5hbWU6ICdXZXN0IFZpcmdpbmlhJyB9LFxcbiAgICAgICAgICAgIHsgY29kZTogJ1dJJywgbmFtZTogJ1dpc2NvbnNpbicgfSxcXG4gICAgICAgICAgICB7IGNvZGU6ICdXWScsIG5hbWU6ICdXeW9taW5nJyB9LFxcbiAgICAgICAgXTtcXG5cXG4gICAgICAgIC4uLlxcblxcbiAgICAgICAgZGlzcGxheUZuOiBmdW5jdGlvbih2YWx1ZSkge1xcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnID8gdmFsdWUubmFtZSA6IHZhbHVlO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIGZpbHRlclN0YXRlczogZnVuY3Rpb24odmFsKSB7XFxuICAgICAgICAgICAgcmV0dXJuIHZhbCA/IHRoaXMuc3RhdGVzLmZpbHRlcigocykgPT4gcy5uYW1lLm1hdGNoKG5ldyBSZWdFeHAodmFsLCAnZ2knKSkpIDogdGhpcy5zdGF0ZXM7XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgLi4uXFxuICAgICAgICBdXT5cXG4gICAgICA8L3ByZT5cXG4gICAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICA8L21hdC1jYXJkPlxcbiAgICAgICAgPG1hdC1jYXJkPlxcbiAgICAgICAgICAgIDxtYXQtY2FyZC10aXRsZSBjbGFzcz1cXFwicGFkLWJvdHRvbS1zbVxcXCIgaWQ9XFxcIkZpbHRlclxcXCI+RmlsdGVyIDxtYXQtaWNvbiBjbGFzcz1cXFwibGluay10by1jb21wb25lbnRcXFwiIHJvdXRlckxpbms9XFxcIi9cXFwiIGZyYWdtZW50PVxcXCJGaWx0ZXJcXFwiPmxpbms8L21hdC1pY29uPjwvbWF0LWNhcmQtdGl0bGU+XFxuICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cXFwibWQtdGl0bGVcXFwiPkF1dG9jb21wbGV0ZSB3aXRoIGNoaXBzIGFuZCBubyBjdXN0b20gaW5wdXRzPC9oMz5cXG4gICAgICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XFxuICAgICAgICAgICAgICAgIDxtYXQtdGFiLWdyb3VwIG1hdC1zdHJldGNoLXRhYnMgZHluYW1pY0hlaWdodCBjb2xvcj1cXFwiYWNjZW50XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtdGFiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBtYXQtdGFiLWxhYmVsPkRlbW88L25nLXRlbXBsYXRlPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInB1c2hcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtYXQtYm9keS0xXFxcIj5UeXBlIGFuZCBzZWxlY3QgYSBwcmVzZXQgb3B0aW9uOjwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQtY2hpcHMgW2l0ZW1zXT1cXFwiaXRlbXNcXFwiIFsobmdNb2RlbCldPVxcXCJpdGVtc1JlcXVpcmVNYXRjaFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVxcXCJFbnRlciBhdXRvY29tcGxldGUgc3RyaW5nc1xcXCIgW2Rpc2FibGVkXT1cXFwicmVhZE9ubHlcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlTWF0Y2g+PC90ZC1jaGlwcz5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LXRhYj5cXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtdGFiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBtYXQtdGFiLWxhYmVsPkNvZGU8L25nLXRlbXBsYXRlPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2FyZC1jb250ZW50PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5IVE1MOjwvcD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByZSBsYW5nPVxcXCJodG1sXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCFbQ0RBVEFbXFxuICAgICAgICA8dGQtY2hpcHMgW2l0ZW1zXT1cXFwiaXRlbXNcXFwiIFsobmdNb2RlbCldPVxcXCJpdGVtc1JlcXVpcmVNYXRjaFxcXCIgcGxhY2Vob2xkZXI9XFxcIkVudGVyIGF1dG9jb21wbGV0ZSBzdHJpbmdzXFxcIlxcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XFxcInJlYWRPbmx5XFxcIiByZXF1aXJlTWF0Y2g+PC90ZC1jaGlwcz5cXG4gICAgICAgICAgXV0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkphdmFzY3JpcHQ6PC9wPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJlIGxhbmc9XFxcImphdmFzY3JpcHRcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IVtDREFUQVtcXG4gICAgICAgIHRoaXMucmVhZE9ubHkgPSBmYWxzZTtcXG5cXG4gICAgICAgIHRoaXMuaXRlbXMgPSBbXFxuICAgICAgICAgICAgJ3N0ZXBwZXInLFxcbiAgICAgICAgICAgICdleHBhbnNpb24tcGFuZWwnLFxcbiAgICAgICAgICAgICdtYXJrZG93bicsXFxuICAgICAgICAgICAgJ2hpZ2hsaWdodCcsXFxuICAgICAgICAgICAgJ2xvYWRpbmcnLFxcbiAgICAgICAgICAgICdtZWRpYScsXFxuICAgICAgICAgICAgJ2NoaXBzJyxcXG4gICAgICAgICAgICAnaHR0cCcsXFxuICAgICAgICAgICAgJ2pzb24tZm9ybWF0dGVyJyxcXG4gICAgICAgICAgICAncGlwZXMnLFxcbiAgICAgICAgICAgICduZWVkIG1vcmU/JyxcXG4gICAgICAgIF07XFxuXFxuICAgICAgICB0aGlzLml0ZW1zUmVxdWlyZU1hdGNoID0gdGhpcy5pdGVtcy5zbGljZSgwLCA2KTtcXG5cXG4gICAgICAgIC4uLlxcblxcbiAgICAgICAgdG9nZ2xlUmVhZE9ubHk6IGZ1bmN0aW9uKCkge1xcbiAgICAgICAgICAgIHRoaXMucmVhZE9ubHkgPSAhdGhpcy5yZWFkT25seTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICAuLi5cXG4gICAgICAgICAgXV0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtdGFiPlxcbiAgICAgICAgICAgICAgICA8L21hdC10YWItZ3JvdXA+XFxuICAgICAgICAgICAgICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxcbiAgICAgICAgICAgICAgICA8bWF0LWNhcmQtYWN0aW9ucz5cXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBjb2xvcj1cXFwicHJpbWFyeVxcXCIgKGNsaWNrKT1cXFwidG9nZ2xlUmVhZE9ubHkoKVxcXCIgY2xhc3M9XFxcInRleHQtdXBwZXJcXFwiPlRvZ2dsZSBSZWFkT25seVxcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQtYWN0aW9ucz5cXG4gICAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cXFwibWQtdGl0bGVcXFwiPkF1dG9jb21wbGV0ZSB3aXRoIGN1c3RvbSBpbnB1dHM8L2gzPlxcbiAgICAgICAgICAgICAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cXG4gICAgICAgICAgICAgICAgPG1hdC10YWItZ3JvdXAgbWF0LXN0cmV0Y2gtdGFicyBkeW5hbWljSGVpZ2h0IGNvbG9yPVxcXCJhY2NlbnRcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPG1hdC10YWI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG1hdC10YWItbGFiZWw+RGVtbzwvbmctdGVtcGxhdGU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicHVzaFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1hdC1ib2R5LTFcXFwiPlR5cGUgYW5kIHNlbGVjdCBvcHRpb24gb3IgZW50ZXIgY3VzdG9tIHRleHQgYW5kIHByZXNzIGVudGVyOjwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQtY2hpcHMgW2l0ZW1zXT1cXFwiaXRlbXNcXFwiIHBsYWNlaG9sZGVyPVxcXCJFbnRlciBhbnkgc3RyaW5nXFxcIj48L3RkLWNoaXBzPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtdGFiPlxcbiAgICAgICAgICAgICAgICAgICAgPG1hdC10YWI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG1hdC10YWItbGFiZWw+Q29kZTwvbmctdGVtcGxhdGU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkhUTUw6PC9wPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJlIGxhbmc9XFxcImh0bWxcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IVtDREFUQVtcXG4gICAgICAgIDx0ZC1jaGlwcyBbaXRlbXNdPVxcXCJpdGVtc1xcXCIgcGxhY2Vob2xkZXI9XFxcIkVudGVyIGFueSBzdHJpbmdcXFwiPjwvdGQtY2hpcHM+XFxuICAgICAgICAgIF1dPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJlPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5KYXZhc2NyaXB0OjwvcD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByZSBsYW5nPVxcXCJqYXZhc2NyaXB0XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCFbQ0RBVEFbXFxuICAgICAgICB0aGlzLml0ZW1zID0gW1xcbiAgICAgICAgICAgICdzdGVwcGVyJyxcXG4gICAgICAgICAgICAnZXhwYW5zaW9uLXBhbmVsJyxcXG4gICAgICAgICAgICAnbWFya2Rvd24nLFxcbiAgICAgICAgICAgICdoaWdobGlnaHQnLFxcbiAgICAgICAgICAgICdsb2FkaW5nJyxcXG4gICAgICAgICAgICAnbWVkaWEnLFxcbiAgICAgICAgICAgICdjaGlwcycsXFxuICAgICAgICAgICAgJ2h0dHAnLFxcbiAgICAgICAgICAgICdqc29uLWZvcm1hdHRlcicsXFxuICAgICAgICAgICAgJ3BpcGVzJyxcXG4gICAgICAgICAgICAnbmVlZCBtb3JlPycsXFxuICAgICAgICBdO1xcbiAgICAgICAgICBdXT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3ByZT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICAgICAgICAgICAgICA8L21hdC10YWI+XFxuICAgICAgICAgICAgICAgIDwvbWF0LXRhYi1ncm91cD5cXG4gICAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cXFwibWQtdGl0bGVcXFwiPkRlbW8gYWxsb3dpbmcgY3VzdG9tIGlucHV0cyBmb3IgdGFnczwvaDM+XFxuICAgICAgICAgICAgICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxcbiAgICAgICAgICAgICAgICA8bWF0LXRhYi1ncm91cCBtYXQtc3RyZXRjaC10YWJzIGR5bmFtaWNIZWlnaHQgY29sb3I9XFxcImFjY2VudFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LXRhYj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbWF0LXRhYi1sYWJlbD5EZW1vPC9uZy10ZW1wbGF0ZT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwdXNoXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibWF0LWJvZHktMVxcXCI+VHlwZSBhbnkgdGVzdCBhbmQgcHJlc3MgZW50ZXI6PC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZC1jaGlwcyBwbGFjZWhvbGRlcj1cXFwiRW50ZXIgYW55IHN0cmluZ1xcXCI+PC90ZC1jaGlwcz5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LXRhYj5cXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtdGFiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBtYXQtdGFiLWxhYmVsPkNvZGU8L25nLXRlbXBsYXRlPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2FyZC1jb250ZW50PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5IVE1MOjwvcD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByZSBsYW5nPVxcXCJodG1sXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCFbQ0RBVEFbXFxuICAgICAgICA8dGQtY2hpcHMgcGxhY2Vob2xkZXI9XFxcIkVudGVyIGFueSBzdHJpbmdcXFwiPjwvdGQtY2hpcHM+XFxuICAgICAgICAgIF1dPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJlPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LXRhYj5cXG4gICAgICAgICAgICAgICAgPC9tYXQtdGFiLWdyb3VwPlxcbiAgICAgICAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cXG4gICAgICAgIDwvbWF0LWNhcmQ+XFxuICAgICAgICA8bWF0LWNhcmQ+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLXRpdGxlIGNsYXNzPVxcXCJwYWQtYm90dG9tLXNtXFxcIiBpZD1cXFwiU2VhcmNoYWJsZUV4cGFuc2lvblBhbmVsc1xcXCI+U2VhcmNoYWJsZS9GaWx0ZXJhYmxlIEV4cGFuc2lvbiBQYW5lbHMgPG1hdC1pY29uIGNsYXNzPVxcXCJsaW5rLXRvLWNvbXBvbmVudFxcXCIgcm91dGVyTGluaz1cXFwiL1xcXCIgZnJhZ21lbnQ9XFxcIlNlYXJjaGFibGVFeHBhbnNpb25QYW5lbHNcXFwiPmxpbms8L21hdC1pY29uPjwvbWF0LWNhcmQtdGl0bGU+XFxuICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICAgICAgICAgIDxtYXQtdGFiLWdyb3VwIG1hdC1zdHJldGNoLXRhYnMgY29sb3I9XFxcImFjY2VudFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LXRhYj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbWF0LXRhYi1sYWJlbD5EZW1vPC9uZy10ZW1wbGF0ZT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYWQtdG9wLW1kIHBhZC1ib3R0b20tbWQgcGFkLXJpZ2h0LXh4bCBwYWQtbGVmdC14eGxcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYWQtdG9wLW1kIHBhZC1ib3R0b20tc21cXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlLWdyb3VwIGZ4TGF5b3V0PVxcXCJyb3dcXFwiIGZ4TGF5b3V0QWxpZ249XFxcInNwYWNlLWJldHdlZW4gY2VudGVyXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVxcXCJleHBhbnNpb24tcGFuZWwtZmlsdGVyLXRvZ2dsZS1ncm91cFxcXCIgbXVsdGlwbGU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIChjaGFuZ2UpPVxcXCJ0b2dnbGVEcm9wbGV0c0ZpbHRlcigndHlwZTphc3NldCcpXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XFxcImlzRHJvcGxldEZpbHRlckNoZWNrZWQoJ3R5cGU6YXNzZXQnKVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZnhGbGV4IGZ4TGF5b3V0PVxcXCJjb2x1bW5cXFwiIGZ4TGF5b3V0QWxpZ249XFxcInNwYWNlLWFyb3VuZCBzdHJldGNoXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1hdC1kaXNwbGF5LTEgcGFkLXRvcC1zbVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnhGbGV4PVxcXCI1NVxcXCI+e3tnZXREcm9wbGV0VHlwZUNvdW50KCdhc3NldCcpfX08L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhZC10b3Atc21cXFwiIGZ4RmxleD1cXFwiNDVcXFwiPkFzc2V0czwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZSAoY2hhbmdlKT1cXFwidG9nZ2xlRHJvcGxldHNGaWx0ZXIoJ3R5cGU6ZXh0ZW5zaW9uJylcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cXFwiaXNEcm9wbGV0RmlsdGVyQ2hlY2tlZCgndHlwZTpleHRlbnNpb24nKVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZnhGbGV4IGZ4TGF5b3V0PVxcXCJjb2x1bW5cXFwiIGZ4TGF5b3V0QWxpZ249XFxcInNwYWNlLWFyb3VuZCBzdHJldGNoXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1hdC1kaXNwbGF5LTEgcGFkLXRvcC1zbVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnhGbGV4PVxcXCI1NVxcXCI+e3tnZXREcm9wbGV0VHlwZUNvdW50KCdleHRlbnNpb24nKX19PC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYWQtdG9wLXNtXFxcIiBmeEZsZXg9XFxcIjQ1XFxcIj5FeHRlbnNpb25zPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIChjaGFuZ2UpPVxcXCJ0b2dnbGVEcm9wbGV0c0ZpbHRlcigndHlwZTpmbG93JylcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cXFwiaXNEcm9wbGV0RmlsdGVyQ2hlY2tlZCgndHlwZTpmbG93JylcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZ4RmxleCBmeExheW91dD1cXFwiY29sdW1uXFxcIiBmeExheW91dEFsaWduPVxcXCJzcGFjZS1hcm91bmQgc3RyZXRjaFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtYXQtZGlzcGxheS0xIHBhZC10b3Atc21cXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ4RmxleD1cXFwiNTVcXFwiPnt7Z2V0RHJvcGxldFR5cGVDb3VudCgnZmxvdycpfX08L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhZC10b3Atc21cXFwiIGZ4RmxleD1cXFwiNDVcXFwiPkZsb3dzPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIChjaGFuZ2UpPVxcXCJ0b2dnbGVEcm9wbGV0c0ZpbHRlcignY29tcGxpYW50LmxhYmVsOkNvbXBsaWFudCcpXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XFxcImlzRHJvcGxldEZpbHRlckNoZWNrZWQoJ2NvbXBsaWFudC5sYWJlbDpDb21wbGlhbnQnKVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZnhGbGV4IGZ4TGF5b3V0PVxcXCJjb2x1bW5cXFwiIGZ4TGF5b3V0QWxpZ249XFxcInNwYWNlLWFyb3VuZCBzdHJldGNoXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1hdC1kaXNwbGF5LTEgcGFkLXRvcC1zbVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnhGbGV4PVxcXCI1NVxcXCI+e3tnZXREcm9wbGV0Q2VydGlmaWNhdGlvbkNvdW50KCdjb21wbGlhbnQnKX19PC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYWQtdG9wLXNtXFxcIiBmeEZsZXg9XFxcIjQ1XFxcIj5Db21wbGlhbnQ8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGUgKGNoYW5nZSk9XFxcInRvZ2dsZURyb3BsZXRzRmlsdGVyKCdmbGVldC5sYWJlbDpGbGVldCcpXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XFxcImlzRHJvcGxldEZpbHRlckNoZWNrZWQoJ2ZsZWV0LmxhYmVsOkZsZWV0JylcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZ4RmxleCBmeExheW91dD1cXFwiY29sdW1uXFxcIiBmeExheW91dEFsaWduPVxcXCJzcGFjZS1hcm91bmQgc3RyZXRjaFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtYXQtZGlzcGxheS0xIHBhZC10b3Atc21cXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ4RmxleD1cXFwiNTVcXFwiPnt7Z2V0RHJvcGxldENlcnRpZmljYXRpb25Db3VudCgnZmxlZXQnKX19PC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYWQtdG9wLXNtXFxcIiBmeEZsZXg9XFxcIjQ1XFxcIj5GbGVldDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZSAoY2hhbmdlKT1cXFwidG9nZ2xlRHJvcGxldHNGaWx0ZXIoJ3Byb2QubGFiZWw6UHJvZHVjdGlvbiBSZWFkeScpXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XFxcImlzRHJvcGxldEZpbHRlckNoZWNrZWQoJ3Byb2QubGFiZWw6UHJvZHVjdGlvbiBSZWFkeScpXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBmeEZsZXggZnhMYXlvdXQ9XFxcImNvbHVtblxcXCIgZnhMYXlvdXRBbGlnbj1cXFwic3BhY2UtYXJvdW5kIHN0cmV0Y2hcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibWF0LWRpc3BsYXktMSBwYWQtdG9wLXNtXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmeEZsZXg9XFxcIjU1XFxcIj57e2dldERyb3BsZXRDZXJ0aWZpY2F0aW9uQ291bnQoJ3Byb2QnKX19PC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYWQtdG9wLXNtXFxcIiBmeEZsZXg9XFxcIjQ1XFxcIj5Qcm9kdWN0aW9uIFJlYWR5PC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIChjaGFuZ2UpPVxcXCJ0b2dnbGVEcm9wbGV0c0ZpbHRlcignc2VjdXJlLmxhYmVsOlNlY3VyZScpXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XFxcImlzRHJvcGxldEZpbHRlckNoZWNrZWQoJ3NlY3VyZS5sYWJlbDpTZWN1cmUnKVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZnhGbGV4IGZ4TGF5b3V0PVxcXCJjb2x1bW5cXFwiIGZ4TGF5b3V0QWxpZ249XFxcInNwYWNlLWFyb3VuZCBzdHJldGNoXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1hdC1kaXNwbGF5LTEgcGFkLXRvcC1zbVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnhGbGV4PVxcXCI1NVxcXCI+e3tnZXREcm9wbGV0Q2VydGlmaWNhdGlvbkNvdW50KCdzZWN1cmUnKX19PC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYWQtdG9wLXNtXFxcIiBmeEZsZXg9XFxcIjQ1XFxcIj5TZWN1cmU8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXA+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVxcXCJmZHMtZHJvcGxldC1maWx0ZXItY2xlYXItZ3JvdXBpbmctYnV0dG9uLWNvbnRhaW5lclxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XFxcImRyb3BsZXRzU2VhcmNoVGVybXMubGVuZ3RoID4gMFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVxcXCJkcm9wbGV0c1NlYXJjaFRlcm1zID0gW107ZmlsdGVyRHJvcGxldHMoYWN0aXZlRHJvcGxldENvbHVtbi5uYW1lLCBhY3RpdmVEcm9wbGV0Q29sdW1uLnNvcnRPcmRlcik7XFxcIj48aVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cXFwiZmEgZmEtcGx1cy1jaXJjbGUgZmEtcm90YXRlLTQ1XFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCI+PC9pPjxzcGFuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVxcXCJwYWQtbGVmdC1zbSBsaW5rXFxcIj5DbGVhciBHcm91cGluZzwvc3Bhbj48L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgbGF5b3V0PVxcXCJyb3dcXFwiIGxheW91dC1hbGlnbj1cXFwic3BhY2UtYmV0d2VlbiBjZW50ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBmbGV4IGZ4TGF5b3V0PVxcXCJyb3dcXFwiIGZ4TGF5b3V0QWxpZ249XFxcImVuZCBjZW50ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZC1jaGlwcyBbKG5nTW9kZWwpXT1cXFwiZHJvcGxldHNTZWFyY2hUZXJtc1xcXCIgW2l0ZW1zXT1cXFwiYXV0b0NvbXBsZXRlRHJvcGxldHNcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhZGQpPVxcXCJmaWx0ZXJEcm9wbGV0cyhhY3RpdmVEcm9wbGV0Q29sdW1uLm5hbWUsIGFjdGl2ZURyb3BsZXRDb2x1bW4uc29ydE9yZGVyKTtcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZW1vdmUpPVxcXCJmaWx0ZXJEcm9wbGV0cyhhY3RpdmVEcm9wbGV0Q29sdW1uLm5hbWUsIGFjdGl2ZURyb3BsZXRDb2x1bW4uc29ydE9yZGVyKTtcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVxcXCJwdXNoLXJpZ2h0LXNtXFxcIj48L3RkLWNoaXBzPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJwdXNoLXRvcC1zbSBwYWQtcmlnaHQtc21cXFwiPlNvcnQgYnk6PC9zcGFuPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XFxcInB1c2gtdG9wLXNtXFxcIiBjb2xvcj1cXFwiZmRzLXByaW1hcnlcXFwiIG1hdC1yYWlzZWQtYnV0dG9uXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVxcXCJkcm9wbGV0R3JpZFNvcnRNZW51XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tnZXRTb3J0QnkoKX19PGkgY2xhc3M9XFxcImZhIGZhLWNhcmV0LWRvd25cXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIj48L2k+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbWVudSBjbGFzcz1cXFwiZmRzLXByaW1hcnktZHJvcGRvd24tYnV0dG9uLW1lbnVcXFwiICNkcm9wbGV0R3JpZFNvcnRNZW51PVxcXCJtYXRNZW51XFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvdmVybGFwVHJpZ2dlcl09XFxcImZhbHNlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cXFwibGV0IGNvbHVtbiBvZiBkcm9wbGV0Q29sdW1uc1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAqbmdJZj1cXFwiY29sdW1uLnNvcnRhYmxlXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XFxcInNvcnREcm9wbGV0cyhjb2x1bW4pO1xcXCI+e3tjb2x1bW4ubGFiZWx9fSB7eyhjb2x1bW4uc29ydE9yZGVyID09PSAnQVNDJykgPyAnREVTQycgOiAnQVNDJ319PC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1tZW51PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYWQtcmlnaHQteHhsIHBhZC1sZWZ0LXh4bFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVxcXCJsZXQgZHJvcGxldCBvZiBmaWx0ZXJlZERyb3BsZXRzXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZC1leHBhbnNpb24tcGFuZWwgY2xhc3M9XFxcIm1hdC1lbGV2YXRpb24tejVcXFwiIGxhYmVsPXt7ZHJvcGxldC5sYWJlbH19XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmxhYmVsPXt7ZHJvcGxldC5zdWJsYWJlbH19IFtkaXNhYmxlZF09XFxcImRpc2FibGVkXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgdGQtZXhwYW5zaW9uLXBhbmVsLWxhYmVsPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZ4TGF5b3V0PVxcXCJjb2x1bW5cXFwiIGZ4TGF5b3V0QWxpZ249XFxcInNwYWNlLWJldHdlZW4gc3RhcnRcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcIm1kLXRpdGxlIHRleHQtY2Fwc1xcXCI+e3tkcm9wbGV0LmRpc3BsYXlOYW1lfX08L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwibWQtc3ViaGVhZFxcXCI+e3tkcm9wbGV0LnR5cGV9fTwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgdGQtZXhwYW5zaW9uLXBhbmVsLXN1YmxhYmVsPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZ4TGF5b3V0PVxcXCJyb3dcXFwiIGZ4TGF5b3V0QWxpZ249XFxcInNwYWNlLWJldHdlZW4gY2VudGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhZC1yaWdodC14eGwgcGFkLWxlZnQteHhsXFxcIiBmeExheW91dD1cXFwiY29sdW1uXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmeExheW91dEFsaWduPVxcXCJzcGFjZS1iZXR3ZWVuIHN0YXJ0XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwidGV4dC11cHBlclxcXCI+VmVyc2lvbnM8L3NwYW4+IHt7ZHJvcGxldC52ZXJzaW9ucy5sZW5ndGh9fVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYWQtcmlnaHQteHhsIHBhZC1sZWZ0LXh4bFxcXCIgZnhMYXlvdXQ9XFxcImNvbHVtblxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnhMYXlvdXRBbGlnbj1cXFwic3BhY2UtYmV0d2VlbiBzdGFydFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcInRleHQtdXBwZXJcXFwiPkZsb3dzPC9zcGFuPiB7e2Ryb3BsZXQuZmxvd3MubGVuZ3RofX1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFkLXJpZ2h0LXh4bCBwYWQtbGVmdC14eGxcXFwiIGZ4TGF5b3V0PVxcXCJjb2x1bW5cXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ4TGF5b3V0QWxpZ249XFxcInNwYWNlLWJldHdlZW4gc3RhcnRcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJ0ZXh0LXVwcGVyXFxcIj5FeHRlbnNpb25zPC9zcGFuPiB7e2Ryb3BsZXQuZXh0ZW5zaW9ucy5sZW5ndGh9fVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYWQtcmlnaHQteHhsIHBhZC1sZWZ0LXh4bFxcXCIgZnhMYXlvdXQ9XFxcImNvbHVtblxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnhMYXlvdXRBbGlnbj1cXFwic3BhY2UtYmV0d2VlbiBzdGFydFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcInRleHQtdXBwZXJcXFwiPkFzc2VzdHM8L3NwYW4+IHt7ZHJvcGxldC5hc3NldHMubGVuZ3RofX1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1hdC1wYWRkaW5nXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBmeExheW91dD1cXFwiY29sdW1uXFxcIiBmeExheW91dEFsaWduPVxcXCJzcGFjZS1iZXR3ZWVuIHN0cmV0Y2hcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFkLWJvdHRvbS1zbVxcXCIgZnhMYXlvdXQ9XFxcInJvd1xcXCIgZnhMYXlvdXRBbGlnbj1cXFwiZW5kIGNlbnRlclxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjb2xvcj1cXFwiZmRzLXByaW1hcnlcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVxcXCJwcmltYXJ5QnV0dG9uRHJvcGRvd25NZW51XFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0LXJhaXNlZC1idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbnM8aSBjbGFzcz1cXFwiZmEgZmEtY2FyZXQtZG93blxcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiPjwvaT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW1lbnUgY2xhc3M9XFxcImZkcy1wcmltYXJ5LWRyb3Bkb3duLWJ1dHRvbi1tZW51XFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjcHJpbWFyeUJ1dHRvbkRyb3Bkb3duTWVudT1cXFwibWF0TWVudVxcXCIgW292ZXJsYXBUcmlnZ2VyXT1cXFwiZmFsc2VcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKm5nRm9yPVxcXCJsZXQgYWN0aW9uIG9mIGRyb3BsZXQuYWN0aW9uc1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57e2FjdGlvbi5uYW1lfX08L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW1lbnU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZnhMYXlvdXQ9XFxcInJvd1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBmeEZsZXg9XFxcIjI1XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcInRleHQtdXBwZXJcXFwiPkRlc2NyaXB0aW9uPC9zcGFuPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5CbGFoIGJsYWggYmxhLCBibGEgYmxhLCBibGFoIGJsYWggYmxhQmxhaCBibGFoIGJsYSwgYmxhIGJsYSwgYmxhaFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxhaCBibGFCbGFoIGJsYWggYmxhLCBibGEgYmxhLCBibGFoIGJsYWggYmxhQmxhaCBibGFoIGJsYSwgYmxhXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGEsIGJsYWggYmxhaCBibGFCbGFoIGJsYWggYmxhLCBibGEgYmxhLCBibGFoIGJsYWggYmxhQmxhaCBibGFoXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGEsIGJsYSBibGEsIGJsYWggYmxhaCBibGFCbGFoIGJsYWggYmxhLCBibGEgYmxhLCBibGFoIGJsYWhcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsYUJsYWggYmxhaCBibGEsIGJsYSBibGEsIGJsYWggYmxhaCBibGFCbGFoIGJsYWggYmxhLCBibGEgYmxhLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxhaCBibGFoIGJsYUJsYWggYmxhaCBibGEsIGJsYSBibGEsIGJsYWggYmxhaCBibGFCbGFoIGJsYWggYmxhLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxhIGJsYSwgYmxhaCBibGFoIGJsYUJsYWggYmxhaCBibGEsIGJsYSBibGEsIGJsYWggYmxhaCBibGFCbGFoXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGFoIGJsYSwgYmxhIGJsYSwgYmxhaCBibGFoIGJsYUJsYWggYmxhaCBibGEsIGJsYSBibGEsIGJsYWhcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsYWggYmxhQmxhaCBibGFoIGJsYSwgYmxhIGJsYSwgYmxhaCBibGFoIGJsYUJsYWggYmxhaCBibGEsIGJsYVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxhLCBibGFoIGJsYWggYmxhPC9wPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZnhGbGV4PVxcXCI1MFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2FyZCBmeEZsZXg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNhcmQtY29udGVudCBjbGFzcz1cXFwicGFkLXRvcC1zbVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XFxcInt7ZHJvcGxldC5pbWd9fVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQ+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBmeEZsZXg9XFxcIjI1XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcInRleHQtdXBwZXJcXFwiPkNoYW5nZSBMb2c8L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkLWV4cGFuc2lvbi1wYW5lbD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhZC1ib3R0b20tc21cXFwiPjwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LXRhYj5cXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtdGFiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBtYXQtdGFiLWxhYmVsPkNvZGU8L25nLXRlbXBsYXRlPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwPkhUTUw6PC9wPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgbGFuZz1cXFwiaHRtbFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPCFbQ0RBVEFbXFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYWQtdG9wLW1kIHBhZC1ib3R0b20tbWQgcGFkLXJpZ2h0LXh4bCBwYWQtbGVmdC14eGxcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhZC10b3AtbWQgcGFkLWJvdHRvbS1zbVxcXCI+XFxuICAgICAgICAgICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZS1ncm91cCBmeExheW91dD1cXFwicm93XFxcIiBmeExheW91dEFsaWduPVxcXCJzcGFjZS1iZXR3ZWVuIGNlbnRlclxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVxcXCJleHBhbnNpb24tcGFuZWwtZmlsdGVyLXRvZ2dsZS1ncm91cFxcXCIgbXVsdGlwbGU+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGUgKGNoYW5nZSk9XFxcInRvZ2dsZURyb3BsZXRzRmlsdGVyKCd0eXBlOmFzc2V0JylcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVxcXCJpc0Ryb3BsZXRGaWx0ZXJDaGVja2VkKCd0eXBlOmFzc2V0JylcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZnhGbGV4IGZ4TGF5b3V0PVxcXCJjb2x1bW5cXFwiIGZ4TGF5b3V0QWxpZ249XFxcInNwYWNlLWFyb3VuZCBzdHJldGNoXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibWF0LWRpc3BsYXktMSBwYWQtdG9wLXNtXFxcIiBmeEZsZXg9XFxcIjU1XFxcIj57IHtnZXREcm9wbGV0VHlwZUNvdW50KCdhc3NldCcpfSB9PC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhZC10b3Atc21cXFwiIGZ4RmxleD1cXFwiNDVcXFwiPkFzc2V0czwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZSAoY2hhbmdlKT1cXFwidG9nZ2xlRHJvcGxldHNGaWx0ZXIoJ3R5cGU6ZXh0ZW5zaW9uJylcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVxcXCJpc0Ryb3BsZXRGaWx0ZXJDaGVja2VkKCd0eXBlOmV4dGVuc2lvbicpXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZ4RmxleCBmeExheW91dD1cXFwiY29sdW1uXFxcIiBmeExheW91dEFsaWduPVxcXCJzcGFjZS1hcm91bmQgc3RyZXRjaFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1hdC1kaXNwbGF5LTEgcGFkLXRvcC1zbVxcXCIgZnhGbGV4PVxcXCI1NVxcXCI+e1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2dldERyb3BsZXRUeXBlQ291bnQoJ2V4dGVuc2lvbicpfSB9PC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhZC10b3Atc21cXFwiIGZ4RmxleD1cXFwiNDVcXFwiPkV4dGVuc2lvbnM8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGUgKGNoYW5nZSk9XFxcInRvZ2dsZURyb3BsZXRzRmlsdGVyKCd0eXBlOmZsb3cnKVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XFxcImlzRHJvcGxldEZpbHRlckNoZWNrZWQoJ3R5cGU6ZmxvdycpXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZ4RmxleCBmeExheW91dD1cXFwiY29sdW1uXFxcIiBmeExheW91dEFsaWduPVxcXCJzcGFjZS1hcm91bmQgc3RyZXRjaFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1hdC1kaXNwbGF5LTEgcGFkLXRvcC1zbVxcXCIgZnhGbGV4PVxcXCI1NVxcXCI+eyB7Z2V0RHJvcGxldFR5cGVDb3VudCgnZmxvdycpfSB9PC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhZC10b3Atc21cXFwiIGZ4RmxleD1cXFwiNDVcXFwiPkZsb3dzPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIChjaGFuZ2UpPVxcXCJ0b2dnbGVEcm9wbGV0c0ZpbHRlcignY29tcGxpYW50LmxhYmVsOkNvbXBsaWFudCcpXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cXFwiaXNEcm9wbGV0RmlsdGVyQ2hlY2tlZCgnY29tcGxpYW50LmxhYmVsOkNvbXBsaWFudCcpXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZ4RmxleCBmeExheW91dD1cXFwiY29sdW1uXFxcIiBmeExheW91dEFsaWduPVxcXCJzcGFjZS1hcm91bmQgc3RyZXRjaFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1hdC1kaXNwbGF5LTEgcGFkLXRvcC1zbVxcXCIgZnhGbGV4PVxcXCI1NVxcXCI+eyB7Z2V0RHJvcGxldENlcnRpZmljYXRpb25Db3VudCgnY29tcGxpYW50Jyl9IH08L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFkLXRvcC1zbVxcXCIgZnhGbGV4PVxcXCI0NVxcXCI+Q29tcGxpYW50PC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIChjaGFuZ2UpPVxcXCJ0b2dnbGVEcm9wbGV0c0ZpbHRlcignZmxlZXQubGFiZWw6RmxlZXQnKVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XFxcImlzRHJvcGxldEZpbHRlckNoZWNrZWQoJ2ZsZWV0LmxhYmVsOkZsZWV0JylcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZnhGbGV4IGZ4TGF5b3V0PVxcXCJjb2x1bW5cXFwiIGZ4TGF5b3V0QWxpZ249XFxcInNwYWNlLWFyb3VuZCBzdHJldGNoXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibWF0LWRpc3BsYXktMSBwYWQtdG9wLXNtXFxcIiBmeEZsZXg9XFxcIjU1XFxcIj57IHtnZXREcm9wbGV0Q2VydGlmaWNhdGlvbkNvdW50KCdmbGVldCcpfSB9PC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhZC10b3Atc21cXFwiIGZ4RmxleD1cXFwiNDVcXFwiPkZsZWV0PC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIChjaGFuZ2UpPVxcXCJ0b2dnbGVEcm9wbGV0c0ZpbHRlcigncHJvZC5sYWJlbDpQcm9kdWN0aW9uIFJlYWR5JylcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVxcXCJpc0Ryb3BsZXRGaWx0ZXJDaGVja2VkKCdwcm9kLmxhYmVsOlByb2R1Y3Rpb24gUmVhZHknKVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBmeEZsZXggZnhMYXlvdXQ9XFxcImNvbHVtblxcXCIgZnhMYXlvdXRBbGlnbj1cXFwic3BhY2UtYXJvdW5kIHN0cmV0Y2hcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtYXQtZGlzcGxheS0xIHBhZC10b3Atc21cXFwiIGZ4RmxleD1cXFwiNTVcXFwiPntcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtnZXREcm9wbGV0Q2VydGlmaWNhdGlvbkNvdW50KCdwcm9kJyl9IH08L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFkLXRvcC1zbVxcXCIgZnhGbGV4PVxcXCI0NVxcXCI+UHJvZHVjdGlvbiBSZWFkeTwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZSAoY2hhbmdlKT1cXFwidG9nZ2xlRHJvcGxldHNGaWx0ZXIoJ3NlY3VyZS5sYWJlbDpTZWN1cmUnKVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XFxcImlzRHJvcGxldEZpbHRlckNoZWNrZWQoJ3NlY3VyZS5sYWJlbDpTZWN1cmUnKVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBmeEZsZXggZnhMYXlvdXQ9XFxcImNvbHVtblxcXCIgZnhMYXlvdXRBbGlnbj1cXFwic3BhY2UtYXJvdW5kIHN0cmV0Y2hcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtYXQtZGlzcGxheS0xIHBhZC10b3Atc21cXFwiIGZ4RmxleD1cXFwiNTVcXFwiPnsge2dldERyb3BsZXRDZXJ0aWZpY2F0aW9uQ291bnQoJ3NlY3VyZScpfSB9PC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhZC10b3Atc21cXFwiIGZ4RmxleD1cXFwiNDVcXFwiPlNlY3VyZTwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cXG4gICAgICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cD5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cXFwiYWN0aXZlRHJvcGxldENvbHVtblxcXCIgbWF0LWJ1dHRvbiBjb2xvcj1cXFwicHJpbWFyeVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVxcXCJkcm9wbGV0c1NlYXJjaFRlcm1zID0gW107ZmlsdGVyRHJvcGxldHMoYWN0aXZlRHJvcGxldENvbHVtbi5uYW1lLCBhY3RpdmVEcm9wbGV0Q29sdW1uLnNvcnRPcmRlcik7XFxcIj5DbGVhciBHcm91cGluZzwvYnV0dG9uPlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDxkaXYgbGF5b3V0PVxcXCJyb3dcXFwiIGxheW91dC1hbGlnbj1cXFwic3BhY2UtYmV0d2VlbiBjZW50ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICA8ZGl2IGZsZXggZnhMYXlvdXQ9XFxcInJvd1xcXCIgZnhMYXlvdXRBbGlnbj1cXFwiZW5kIGNlbnRlclxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8dGQtY2hpcHMgWyhuZ01vZGVsKV09XFxcImRyb3BsZXRzU2VhcmNoVGVybXNcXFwiIFtpdGVtc109XFxcImF1dG9Db21wbGV0ZURyb3BsZXRzXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhZGQpPVxcXCJmaWx0ZXJEcm9wbGV0cyhhY3RpdmVEcm9wbGV0Q29sdW1uLm5hbWUsIGFjdGl2ZURyb3BsZXRDb2x1bW4uc29ydE9yZGVyKTtcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlbW92ZSk9XFxcImZpbHRlckRyb3BsZXRzKGFjdGl2ZURyb3BsZXRDb2x1bW4ubmFtZSwgYWN0aXZlRHJvcGxldENvbHVtbi5zb3J0T3JkZXIpO1xcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cXFwicHVzaC1yaWdodC1zbVxcXCI+PC90ZC1jaGlwcz5cXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJwYWQtcmlnaHQtc21cXFwiPlNvcnQgYnk6PC9zcGFuPlxcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjb2xvcj1cXFwiZmRzLXByaW1hcnlcXFwiIG1hdC1yYWlzZWQtYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XFxcImRyb3BsZXRHcmlkU29ydE1lbnVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsge2dldFNvcnRCeSgpfSB9PGkgY2xhc3M9XFxcImZhIGZhLWNhcmV0LWRvd25cXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIj48L2k+XFxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgIDxtYXQtbWVudSBjbGFzcz1cXFwiZmRzLXByaW1hcnktZHJvcGRvd24tYnV0dG9uLW1lbnVcXFwiICNkcm9wbGV0R3JpZFNvcnRNZW51PVxcXCJtYXRNZW51XFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW292ZXJsYXBUcmlnZ2VyXT1cXFwiZmFsc2VcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XFxcImxldCBjb2x1bW4gb2YgZHJvcGxldENvbHVtbnNcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAqbmdJZj1cXFwiY29sdW1uLnNvcnRhYmxlXFxcIiAoY2xpY2spPVxcXCJzb3J0RHJvcGxldHMoY29sdW1uKTtcXFwiPntcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2NvbHVtbi5sYWJlbH0gfSB7IHsoY29sdW1uLnNvcnRPcmRlciA9PT0gJ0FTQycpID8gJ0RFU0MnIDogJ0FTQyd9IH08L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICA8L21hdC1tZW51PlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYWQtcmlnaHQteHhsIHBhZC1sZWZ0LXh4bFxcXCI+XFxuICAgICAgICAgICAgPGRpdiAqbmdGb3I9XFxcImxldCBkcm9wbGV0IG9mIGZpbHRlcmVkRHJvcGxldHNcXFwiPlxcbiAgICAgICAgICAgICAgICA8dGQtZXhwYW5zaW9uLXBhbmVsIGNsYXNzPVxcXCJtYXQtZWxldmF0aW9uLXo1XFxcIiBsYWJlbD17IHtkcm9wbGV0LmxhYmVsfSB9IHN1YmxhYmVsPXsge2Ryb3BsZXQuc3VibGFiZWx9IH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVxcXCJkaXNhYmxlZFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgdGQtZXhwYW5zaW9uLXBhbmVsLWxhYmVsPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZnhMYXlvdXQ9XFxcImNvbHVtblxcXCIgZnhMYXlvdXRBbGlnbj1cXFwic3BhY2UtYmV0d2VlbiBzdGFydFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJtZC10aXRsZSB0ZXh0LWNhcHNcXFwiPnsge2Ryb3BsZXQuZGlzcGxheU5hbWV9IH08L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJtZC1zdWJoZWFkXFxcIj57IHtkcm9wbGV0LnR5cGV9IH08L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHRkLWV4cGFuc2lvbi1wYW5lbC1zdWJsYWJlbD5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZ4TGF5b3V0PVxcXCJyb3dcXFwiIGZ4TGF5b3V0QWxpZ249XFxcInNwYWNlLWJldHdlZW4gY2VudGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFkLXJpZ2h0LXh4bCBwYWQtbGVmdC14eGxcXFwiIGZ4TGF5b3V0PVxcXCJjb2x1bW5cXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnhMYXlvdXRBbGlnbj1cXFwic3BhY2UtYmV0d2VlbiBzdGFydFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwidGV4dC11cHBlclxcXCI+VmVyc2lvbnM8L3NwYW4+IHsge2Ryb3BsZXQudmVyc2lvbnMubGVuZ3RofSB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYWQtcmlnaHQteHhsIHBhZC1sZWZ0LXh4bFxcXCIgZnhMYXlvdXQ9XFxcImNvbHVtblxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmeExheW91dEFsaWduPVxcXCJzcGFjZS1iZXR3ZWVuIHN0YXJ0XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJ0ZXh0LXVwcGVyXFxcIj5GbG93czwvc3Bhbj4geyB7ZHJvcGxldC5mbG93cy5sZW5ndGh9IH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhZC1yaWdodC14eGwgcGFkLWxlZnQteHhsXFxcIiBmeExheW91dD1cXFwiY29sdW1uXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ4TGF5b3V0QWxpZ249XFxcInNwYWNlLWJldHdlZW4gc3RhcnRcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcInRleHQtdXBwZXJcXFwiPkV4dGVuc2lvbnM8L3NwYW4+IHsge2Ryb3BsZXQuZXh0ZW5zaW9ucy5sZW5ndGh9IH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhZC1yaWdodC14eGwgcGFkLWxlZnQteHhsXFxcIiBmeExheW91dD1cXFwiY29sdW1uXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ4TGF5b3V0QWxpZ249XFxcInNwYWNlLWJldHdlZW4gc3RhcnRcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcInRleHQtdXBwZXJcXFwiPkFzc2VzdHM8L3NwYW4+IHsge2Ryb3BsZXQuYXNzZXRzLmxlbmd0aH0gfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtYXQtcGFkZGluZ1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBmeExheW91dD1cXFwiY29sdW1uXFxcIiBmeExheW91dEFsaWduPVxcXCJzcGFjZS1iZXR3ZWVuIHN0cmV0Y2hcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYWQtYm90dG9tLXNtXFxcIiBmeExheW91dD1cXFwicm93XFxcIiBmeExheW91dEFsaWduPVxcXCJlbmQgY2VudGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY29sb3I9XFxcImZkcy1wcmltYXJ5XFxcIiBbbWF0TWVudVRyaWdnZXJGb3JdPVxcXCJwcmltYXJ5QnV0dG9uRHJvcGRvd25NZW51XFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQtcmFpc2VkLWJ1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25zPGkgY2xhc3M9XFxcImZhIGZhLWNhcmV0LWRvd25cXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIj48L2k+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbWVudSBjbGFzcz1cXFwiZmRzLXByaW1hcnktZHJvcGRvd24tYnV0dG9uLW1lbnVcXFwiICNwcmltYXJ5QnV0dG9uRHJvcGRvd25NZW51PVxcXCJtYXRNZW51XFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvdmVybGFwVHJpZ2dlcl09XFxcImZhbHNlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKm5nRm9yPVxcXCJsZXQgYWN0aW9uIG9mIGRyb3BsZXQuYWN0aW9uc1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnsge2FjdGlvbi5uYW1lfSB9PC9zcGFuPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtbWVudT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZnhMYXlvdXQ9XFxcInJvd1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZ4RmxleD1cXFwiMjVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJ0ZXh0LXVwcGVyXFxcIj5EZXNjcmlwdGlvbjwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5CbGFoIGJsYWggYmxhLCBibGEgYmxhLCBibGFoIGJsYWggYmxhQmxhaCBibGFoIGJsYSwgYmxhIGJsYSwgYmxhaCBibGFoIGJsYUJsYWggYmxhaCBibGEsIGJsYSBibGEsIGJsYWggYmxhaCBibGFCbGFoIGJsYWggYmxhLCBibGEgYmxhLCBibGFoIGJsYWggYmxhQmxhaCBibGFoIGJsYSwgYmxhIGJsYSwgYmxhaCBibGFoIGJsYUJsYWggYmxhaCBibGEsIGJsYSBibGEsIGJsYWggYmxhaCBibGFCbGFoIGJsYWggYmxhLCBibGEgYmxhLCBibGFoIGJsYWggYmxhQmxhaCBibGFoIGJsYSwgYmxhIGJsYSwgYmxhaCBibGFoIGJsYUJsYWggYmxhaCBibGEsIGJsYSBibGEsIGJsYWggYmxhaCBibGFCbGFoIGJsYWggYmxhLCBibGEgYmxhLCBibGFoIGJsYWggYmxhQmxhaCBibGFoIGJsYSwgYmxhIGJsYSwgYmxhaCBibGFoIGJsYUJsYWggYmxhaCBibGEsIGJsYSBibGEsIGJsYWggYmxhaCBibGFCbGFoIGJsYWggYmxhLCBibGEgYmxhLCBibGFoIGJsYWggYmxhQmxhaCBibGFoIGJsYSwgYmxhIGJsYSwgYmxhaCBibGFoIGJsYUJsYWggYmxhaCBibGEsIGJsYSBibGEsIGJsYWggYmxhaCBibGFCbGFoIGJsYWggYmxhLCBibGEgYmxhLCBibGFoIGJsYWggYmxhPC9wPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZ4RmxleD1cXFwiNTBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2FyZCBmeEZsZXg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2FyZC1jb250ZW50IGNsYXNzPVxcXCJwYWQtdG9wLXNtXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVxcXCJ7IHtkcm9wbGV0LmltZ30gfVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jYXJkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZ4RmxleD1cXFwiMjVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJ0ZXh0LXVwcGVyXFxcIj5DaGFuZ2UgTG9nPC9zcGFuPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgIDwvdGQtZXhwYW5zaW9uLXBhbmVsPlxcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYWQtYm90dG9tLXNtXFxcIj48L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgICAgICBdXT5cXG4gICAgICAgICAgICAgICAgICAgIDwvcHJlPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwPkphdmFzY3JpcHQ6PC9wPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgbGFuZz1cXFwiamF2YXNjcmlwdFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPCFbQ0RBVEFbXFxuICAgICAgICB0aGlzLmRhdGFUYWJsZVNlcnZpY2UgPSBUZERhdGFUYWJsZVNlcnZpY2U7XFxuXFxuICAgICAgICB0aGlzLmRyb3BsZXRzID0gW1xcbiAgICAgICAgICAgIHtcXG4gICAgICAgICAgICAgICAgaWQ6ICcyM2Y2Y2M1OS0wMTU2LTEwMDAtMDliNC0yYjA2MTAwODkwOTAnLFxcbiAgICAgICAgICAgICAgICBuYW1lOiBcXFwiRGVjb21wcmVzc2lvbl9DaXJjdWxhcl9GbG93XFxcIixcXG4gICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdEZWNvbXByZXNzZWQgQ2lyY3VsYXIgZmxvdycsXFxuICAgICAgICAgICAgICAgIHR5cGU6ICdmbG93JyxcXG4gICAgICAgICAgICAgICAgc3VibGFiZWw6ICdBIHN1YmxhYmVsJyxcXG4gICAgICAgICAgICAgICAgY29tcGxpYW50OiB7XFxuICAgICAgICAgICAgICAgICAgICBpZDogJzI1ZmQ2dnY4Ny0zNTQ5LTAwMDEtMDVnNi00ZDQ1Njc4OTA3NjUnLFxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdDb21wbGlhbnQnLFxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2NlcnRpZmljYXRpb24nXFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIGZsZWV0OiB7XFxuICAgICAgICAgICAgICAgICAgICBpZDogJzIzZjZjYzU5LTM1NDktMDAwMS0wNWc2LTRkNDU2Nzg5MDc2NScsXFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0ZsZWV0JyxcXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjZXJ0aWZpY2F0aW9uJ1xcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICBwcm9kOiB7XFxuICAgICAgICAgICAgICAgICAgICBpZDogJzUyZmQ2dnY4Ny0zNTQ5LTAwMDEtMDVnNi00ZDQ1Njc4OTA3NjUnLFxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdQcm9kdWN0aW9uIFJlYWR5JyxcXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjZXJ0aWZpY2F0aW9uJ1xcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICBzZWN1cmU6IHtcXG4gICAgICAgICAgICAgICAgICAgIGlkOiAnMzJmNmNjNTktMzU0OS0wMDAxLTA1ZzYtNGQ0NTY3ODkwNzY1JyxcXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnU2VjdXJlJyxcXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjZXJ0aWZpY2F0aW9uJ1xcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICB2ZXJzaW9uczogW1xcbiAgICAgICAgICAgICAgICAgICAge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnMjNmNmNjNTktMDE1Ni0xMDAwLTA2YjQtMmIwODEwMDg5MDkwJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXZpc2lvbjogJzEnLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVudEZsb3dzOiBbXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnMjVmZDZ2djg3LTM1NDktMDAwMS0wNWc2LTRkNDU2Nzg5MDc2NSdcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgIF0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZDogZGF0ZS5zZXREYXRlKGRhdGUuZ2V0RGF0ZSgpIC0gMSksXFxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZDogbmV3IERhdGUoKVxcbiAgICAgICAgICAgICAgICAgICAgfSwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnMjVmZDZ2djg3LTM1NDktMDAwMS0wNWc2LTRkNDU2Nzg5MDc2NScsXFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV2aXNpb246ICcyJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbnRGbG93czogW1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogJzIzZjZjYzU5LTAxNTYtMTAwMC0wNmI0LTJiMDgxMDA4OTA5MCdcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgIF0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZDogbmV3IERhdGUoKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkOiBuZXcgRGF0ZSgpXFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIF0sXFxuICAgICAgICAgICAgICAgIGZsb3dzOiBbXSxcXG4gICAgICAgICAgICAgICAgZXh0ZW5zaW9uczogW10sXFxuICAgICAgICAgICAgICAgIGFzc2V0czogW10sXFxuICAgICAgICAgICAgICAgIGFjdGlvbnM6IFtcXG4gICAgICAgICAgICAgICAgICAgIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdEZWxldGUnLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICdpY29uJzogJ2ZhIGZhLWNsb3NlJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAndG9vbHRpcCc6ICdEZWxldGUgVXNlcidcXG4gICAgICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgICAgICB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnTWFuYWdlJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAnaWNvbic6ICdmYSBmYS11c2VyJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAndG9vbHRpcCc6ICdNYW5hZ2UgVXNlcidcXG4gICAgICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgICAgICB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnQWN0aW9uIDMnLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICdpY29uJzogJ2ZhIGZhLXF1ZXN0aW9uJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAndG9vbHRpcCc6ICdXaGF0ZXZlciBlbHNlIHdlIHdhbnQgdG8gZG8uLi4nXFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIF1cXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHtcXG4gICAgICAgICAgICAgICAgaWQ6ICcyNWZkNnZ2ODctMzI0OS0wMDAxLTA1ZzYtNGQ0NzY3ODkwNzY1JyxcXG4gICAgICAgICAgICAgICAgbmFtZTogXFxcIkRhdGVDb252ZXJzaW9uXFxcIixcXG4gICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdEYXRlIGNvbnZlcnNpb24nLFxcbiAgICAgICAgICAgICAgICB0eXBlOiAnYXNzZXQnLFxcbiAgICAgICAgICAgICAgICBzdWJsYWJlbDogJ0Egc3VibGFiZWwnLFxcbiAgICAgICAgICAgICAgICBjb21wbGlhbnQ6IHtcXG4gICAgICAgICAgICAgICAgICAgIGlkOiAnMjVmZDZ2djM0LTM1NDktMDAwMS0wNWc2LTRkNDU2Nzg5MDc2NScsXFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0NvbXBsaWFudCcsXFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY2VydGlmaWNhdGlvbidcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgcHJvZDoge1xcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICc1MnZuNnZ2ODctMzU0OS0wMDAxLTA1ZzYtNGQ0NTY3ODkwNzY1JyxcXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnUHJvZHVjdGlvbiBSZWFkeScsXFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY2VydGlmaWNhdGlvbidcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgdmVyc2lvbnM6IFtcXG4gICAgICAgICAgICAgICAgICAgIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogJzIzZjZpYzU5LTAxNTYtMTAwMC0wNmI0LTJiMDgxMDA4OTA5MCcsXFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV2aXNpb246ICcxJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbnRGbG93czogW1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogJzIzZjZjYzE5LTAxNTYtMTAwMC0wNmI0LTJiMDgxMDA4OTA5MCdcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgIF0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZDogbmV3IERhdGUoKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkOiBuZXcgRGF0ZSgpXFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIF0sXFxuICAgICAgICAgICAgICAgIGZsb3dzOiBbXSxcXG4gICAgICAgICAgICAgICAgZXh0ZW5zaW9uczogW10sXFxuICAgICAgICAgICAgICAgIGFzc2V0czogW10sXFxuICAgICAgICAgICAgICAgIGFjdGlvbnM6IFtcXG4gICAgICAgICAgICAgICAgICAgIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdEZWxldGUnLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICdpY29uJzogJ2ZhIGZhLWNsb3NlJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAndG9vbHRpcCc6ICdEZWxldGUgVXNlcidcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgXVxcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAge1xcbiAgICAgICAgICAgICAgICBpZDogJzUyZmQ2dnY4Ny0zMjk0LTAwMDEtMDVnNi00ZDQ3Njc4OTA3NjUnLFxcbiAgICAgICAgICAgICAgICBuYW1lOiBcXFwibmlmaS1lbWFpbC1idW5kbGVcXFwiLFxcbiAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogJ25pZmktZW1haWwtYnVuZGxlJyxcXG4gICAgICAgICAgICAgICAgdHlwZTogJ2V4dGVuc2lvbicsXFxuICAgICAgICAgICAgICAgIHN1YmxhYmVsOiAnQSBzdWJsYWJlbCcsXFxuICAgICAgICAgICAgICAgIGNvbXBsaWFudDoge1xcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICczM2ZkNnZ2ODctMzU0OS0wMDAxLTA1ZzYtNGQ0NTY3ODkwNzY1JyxcXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnQ29tcGxpYW50JyxcXG4gICAgICAgICAgICAgICAgICAgIHRlc3Q6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ3Rlc3QnXFxuICAgICAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2NlcnRpZmljYXRpb24nXFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIHZlcnNpb25zOiBbXFxuICAgICAgICAgICAgICAgICAgICB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICcyM2QzY2M1OS0wMTU2LTEwMDAtMDZiNC0yYjA4MTAwODkwOTAnLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldmlzaW9uOiAnMScsXFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW50Rmxvd3M6IFtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICcyM2Y2Y2M4OS0wMTU2LTEwMDAtMDZiNC0yYjA4MTAwODkwOTAnXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICBdLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWQ6IG5ldyBEYXRlKCksXFxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZDogbmV3IERhdGUoKVxcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBdLFxcbiAgICAgICAgICAgICAgICBmbG93czogW10sXFxuICAgICAgICAgICAgICAgIGV4dGVuc2lvbnM6IFtdLFxcbiAgICAgICAgICAgICAgICBhc3NldHM6IFtdLFxcbiAgICAgICAgICAgICAgICBhY3Rpb25zOiBbXFxuICAgICAgICAgICAgICAgICAgICB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnRGVsZXRlJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAnaWNvbic6ICdmYSBmYS1jbG9zZScsXFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3Rvb2x0aXAnOiAnRGVsZXRlIFVzZXInXFxuICAgICAgICAgICAgICAgICAgICB9LCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnTWFuYWdlJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAnaWNvbic6ICdmYSBmYS11c2VyJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAndG9vbHRpcCc6ICdNYW5hZ2UgVXNlcidcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgXVxcbiAgICAgICAgfV07XFxuXFxuICAgICAgICB0aGlzLmZpbHRlcmVkRHJvcGxldHMgPSBbXTtcXG5cXG4gICAgICAgIHRoaXMuZHJvcGxldENvbHVtbnMgPSBbXFxuICAgICAgICAgICAgeyBuYW1lOiAnaWQnLCBsYWJlbDogJ0lEJywgc29ydGFibGU6IHRydWUgfSxcXG4gICAgICAgICAgICB7IG5hbWU6ICduYW1lJywgbGFiZWw6ICdOYW1lJywgc29ydGFibGU6IHRydWUgfSxcXG4gICAgICAgICAgICB7IG5hbWU6ICdkaXNwbGF5TmFtZScsIGxhYmVsOiAnRGlzcGxheSBOYW1lJywgc29ydGFibGU6IHRydWUgfSxcXG4gICAgICAgICAgICB7IG5hbWU6ICdzdWJsYWJlbCcsIGxhYmVsOiAnTGFiZWwnLCBzb3J0YWJsZTogdHJ1ZSB9LFxcbiAgICAgICAgICAgIHsgbmFtZTogJ3R5cGUnLCBsYWJlbDogJ1R5cGUnLCBzb3J0YWJsZTogdHJ1ZSB9XFxuICAgICAgICBdO1xcblxcbiAgICAgICAgdGhpcy5hdXRvQ29tcGxldGVEcm9wbGV0cyA9IFtdO1xcbiAgICAgICAgdGhpcy5kcm9wbGV0c1NlYXJjaFRlcm1zID0gW107XFxuXFxuICAgICAgICAuLi5cXG5cXG4gICAgICAgIGlzRHJvcGxldEZpbHRlckNoZWNrZWQ6IGZ1bmN0aW9uKHRlcm0pIHtcXG4gICAgICAgICAgICByZXR1cm4gKHRoaXMuZHJvcGxldHNTZWFyY2hUZXJtcy5pbmRleE9mKHRlcm0pID4gLTEpO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIGdldERyb3BsZXRUeXBlQ291bnQ6IGZ1bmN0aW9uKHR5cGUpIHtcXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJlZERyb3BsZXRzLmZpbHRlcihmdW5jdGlvbihkcm9wbGV0KSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBkcm9wbGV0LnR5cGUgPT09IHR5cGU7XFxuICAgICAgICAgICAgfSkubGVuZ3RoO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIGdldERyb3BsZXRDZXJ0aWZpY2F0aW9uQ291bnQ6IGZ1bmN0aW9uKGNlcnRpZmljYXRpb24pIHtcXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJlZERyb3BsZXRzLmZpbHRlcihkcm9wbGV0ID0+IHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGRyb3BsZXQpLmZpbmQoKGtleSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gY2VydGlmaWNhdGlvbiAmJiBkcm9wbGV0W2NlcnRpZmljYXRpb25dLnR5cGUgPT09ICdjZXJ0aWZpY2F0aW9uJykge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkcm9wbGV0O1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9KS5sZW5ndGg7XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgZ2V0U29ydEJ5OiBmdW5jdGlvbigpIHtcXG4gICAgICAgICAgICB2YXIgc29ydEJ5Q29sdW1uTGFiZWw7XFxuICAgICAgICAgICAgdmFyIGFycmF5TGVuZ3RoID0gdGhpcy5kcm9wbGV0Q29sdW1ucy5sZW5ndGg7XFxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheUxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRyb3BsZXRDb2x1bW5zW2ldLmFjdGl2ZSA9PT0gdHJ1ZSkge1xcbiAgICAgICAgICAgICAgICAgICAgc29ydEJ5Q29sdW1uTGFiZWwgPSB0aGlzLmRyb3BsZXRDb2x1bW5zW2ldLmxhYmVsO1xcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIHNvcnRCeUNvbHVtbkxhYmVsO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIHNvcnREcm9wbGV0czogZnVuY3Rpb24oY29sdW1uKSB7XFxuICAgICAgICAgICAgaWYgKGNvbHVtbi5zb3J0YWJsZSA9PT0gdHJ1ZSkge1xcbiAgICAgICAgICAgICAgICAvLyB0b2dnbGUgY29sdW1uIHNvcnQgb3JkZXJcXG4gICAgICAgICAgICAgICAgdmFyIHNvcnRPcmRlciA9IGNvbHVtbi5zb3J0T3JkZXIgPSAoY29sdW1uLnNvcnRPcmRlciA9PT0gJ0FTQycpID8gJ0RFU0MnIDogJ0FTQyc7XFxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyRHJvcGxldHMoY29sdW1uLm5hbWUsIHNvcnRPcmRlcik7XFxuXFxuICAgICAgICAgICAgICAgIC8vb25seSBvbmUgY29sdW1uIGNhbiBiZSBhY3RpdmVseSBzb3J0ZWQgc28gd2UgcmVzZXQgYWxsIHRvIGluYWN0aXZlXFxuICAgICAgICAgICAgICAgIHRoaXMuZHJvcGxldENvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoYykge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmFjdGl2ZSA9IGZhbHNlO1xcbiAgICAgICAgICAgICAgICB9KTtcXG5cXG4gICAgICAgICAgICAgICAgLy9hbmQgc2V0IHRoaXMgY29sdW1uIGFzIHRoZSBhY3RpdmVseSBzb3J0ZWQgY29sdW1uXFxuICAgICAgICAgICAgICAgIGNvbHVtbi5hY3RpdmUgPSB0cnVlO1xcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZURyb3BsZXRDb2x1bW4gPSBjb2x1bW47XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIHRvZ2dsZURyb3BsZXRzRmlsdGVyOiBmdW5jdGlvbihzZWFyY2hUZXJtKSB7XFxuICAgICAgICAgICAgdmFyIGFwcGx5U2VhcmNoVGVybSA9IHRydWU7XFxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHNlYXJjaCB0ZXJtIGlzIGFscmVhZHkgYXBwbGllZCBhbmQgcmVtb3ZlIGl0IGlmIHRydWVcXG4gICAgICAgICAgICBpZiAodGhpcy5kcm9wbGV0c1NlYXJjaFRlcm1zLmxlbmd0aCA+IDApIHtcXG4gICAgICAgICAgICAgICAgdmFyIGFycmF5TGVuZ3RoID0gdGhpcy5kcm9wbGV0c1NlYXJjaFRlcm1zLmxlbmd0aDtcXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheUxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLmRyb3BsZXRzU2VhcmNoVGVybXMuaW5kZXhPZihzZWFyY2hUZXJtKTtcXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kcm9wbGV0c1NlYXJjaFRlcm1zLnNwbGljZShpbmRleCwgMSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlTZWFyY2hUZXJtID0gZmFsc2U7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgLy8gaWYgd2UganVzdCByZW1vdmVkIHRoZSBzZWFyY2ggdGVybSBkbyBOT1QgYXBwbHkgaXQgYWdhaW5cXG4gICAgICAgICAgICBpZiAoYXBwbHlTZWFyY2hUZXJtKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMuZHJvcGxldHNTZWFyY2hUZXJtcy5wdXNoKHNlYXJjaFRlcm0pO1xcbiAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICB0aGlzLmZpbHRlckRyb3BsZXRzKHRoaXMuYWN0aXZlRHJvcGxldENvbHVtbi5uYW1lLCB0aGlzLmFjdGl2ZURyb3BsZXRDb2x1bW4uc29ydE9yZGVyKTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBmaWx0ZXJEcm9wbGV0czogZnVuY3Rpb24oc29ydEJ5LCBzb3J0T3JkZXIpIHtcXG4gICAgICAgICAgICAvLyBpZiBgc29ydEJ5YCBpcyBgdW5kZWZpbmVkYCB0aGVuIGZpbmQgdGhlIGZpcnN0IHNvcnRhYmxlIGNvbHVtbiBpbiB0aGlzLmRyb3BsZXRDb2x1bW5zXFxuICAgICAgICAgICAgaWYgKHNvcnRCeSA9PT0gdW5kZWZpbmVkKSB7XFxuICAgICAgICAgICAgICAgIHZhciBhcnJheUxlbmd0aCA9IHRoaXMuZHJvcGxldENvbHVtbnMubGVuZ3RoO1xcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5TGVuZ3RoOyBpKyspIHtcXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRyb3BsZXRDb2x1bW5zW2ldLnNvcnRhYmxlID09PSB0cnVlKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgc29ydEJ5ID0gdGhpcy5kcm9wbGV0Q29sdW1uc1tpXS5uYW1lO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlRHJvcGxldENvbHVtbiA9IHRoaXMuZHJvcGxldENvbHVtbnNbaV07XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgLy9vbmx5IG9uZSBjb2x1bW4gY2FuIGJlIGFjdGl2ZWx5IHNvcnRlZCBzbyB3ZSByZXNldCBhbGwgdG8gaW5hY3RpdmVcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRyb3BsZXRDb2x1bW5zLmZvckVhY2goYyA9PiBjLmFjdGl2ZSA9IGZhbHNlKTtcXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2FuZCBzZXQgdGhpcyBjb2x1bW4gYXMgdGhlIGFjdGl2ZWx5IHNvcnRlZCBjb2x1bW5cXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRyb3BsZXRDb2x1bW5zW2ldLmFjdGl2ZSA9IHRydWU7XFxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgLy8gaWYgYHNvcnRPcmRlcmAgaXMgYHVuZGVmaW5lZGAgdGhlbiB1c2UgJ0FTQydcXG4gICAgICAgICAgICBpZiAoc29ydE9yZGVyID09PSB1bmRlZmluZWQpIHtcXG4gICAgICAgICAgICAgICAgc29ydE9yZGVyID0gJ0FTQydcXG4gICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgdmFyIG5ld0RhdGEgPSB0aGlzLmRyb3BsZXRzO1xcblxcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5kcm9wbGV0c1NlYXJjaFRlcm1zLmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgIG5ld0RhdGEgPSB0aGlzLmZpbHRlckRhdGEobmV3RGF0YSwgdGhpcy5kcm9wbGV0c1NlYXJjaFRlcm1zW2ldLCB0cnVlLCB0aGlzLmFjdGl2ZURyb3BsZXRDb2x1bW4ubmFtZSk7XFxuICAgICAgICAgICAgfVxcblxcbiAgICAgICAgICAgIG5ld0RhdGEgPSB0aGlzLmRhdGFUYWJsZVNlcnZpY2Uuc29ydERhdGEobmV3RGF0YSwgc29ydEJ5LCBzb3J0T3JkZXIpO1xcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyZWREcm9wbGV0cyA9IG5ld0RhdGE7XFxuICAgICAgICAgICAgdGhpcy5nZXRBdXRvQ29tcGxldGVEcm9wbGV0cygpO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIGdldEF1dG9Db21wbGV0ZURyb3BsZXRzOiBmdW5jdGlvbigpIHtcXG4gICAgICAgICAgICB0aGlzLmF1dG9Db21wbGV0ZURyb3BsZXRzID0gW107XFxuICAgICAgICAgICAgdGhpcy5kcm9wbGV0Q29sdW1ucy5mb3JFYWNoKGMgPT4gdGhpcy5maWx0ZXJlZERyb3BsZXRzLmZvckVhY2gociA9PiAocltjLm5hbWUudG9Mb3dlckNhc2UoKV0pID8gdGhpcy5hdXRvQ29tcGxldGVEcm9wbGV0cy5wdXNoKHJbYy5uYW1lLnRvTG93ZXJDYXNlKCldLnRvU3RyaW5nKCkpIDogJycpKTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBmaWx0ZXJEYXRhOiBmdW5jdGlvbihkYXRhLCBzZWFyY2hUZXJtLCBpZ25vcmVDYXNlKSB7XFxuICAgICAgICAgICAgdmFyIGZpZWxkID0gJyc7XFxuICAgICAgICAgICAgaWYgKHNlYXJjaFRlcm0uaW5kZXhPZihcXFwiOlxcXCIpID4gLTEpIHtcXG4gICAgICAgICAgICAgICAgZmllbGQgPSBzZWFyY2hUZXJtLnNwbGl0KCc6JylbMF0udHJpbSgpO1xcbiAgICAgICAgICAgICAgICBzZWFyY2hUZXJtID0gc2VhcmNoVGVybS5zcGxpdCgnOicpWzFdLnRyaW0oKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgdmFyIGZpbHRlciA9IHNlYXJjaFRlcm0gPyAoaWdub3JlQ2FzZSA/IHNlYXJjaFRlcm0udG9Mb3dlckNhc2UoKSA6IHNlYXJjaFRlcm0pIDogJyc7XFxuXFxuICAgICAgICAgICAgaWYgKGZpbHRlcikge1xcbiAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5maWx0ZXIoaXRlbSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlcyA9IE9iamVjdC5rZXlzKGl0ZW0pLmZpbmQoKGtleSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5pbmRleE9mKFxcXCIuXFxcIikgPiAtMSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgb2JqQXJyYXkgPSBmaWVsZC5zcGxpdChcXFwiLlxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgb2JqID0gaXRlbTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFycmF5TGVuZ3RoID0gb2JqQXJyYXkubGVuZ3RoO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5TGVuZ3RoOyBpKyspIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqID0gb2JqW29iakFycmF5W2ldXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByZUl0ZW1WYWx1ZSA9ICgnJyArIG9iaik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpdGVtVmFsdWUgPSBpZ25vcmVDYXNlID8gcHJlSXRlbVZhbHVlLnRvTG93ZXJDYXNlKCkgOiBwcmVJdGVtVmFsdWU7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtVmFsdWUuaW5kZXhPZihmaWx0ZXIpID4gLTE7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleSAhPT0gZmllbGQgJiYgZmllbGQgIT09ICcnKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByZUl0ZW1WYWx1ZSA9ICgnJyArIGl0ZW1ba2V5XSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpdGVtVmFsdWUgPSBpZ25vcmVDYXNlID8gcHJlSXRlbVZhbHVlLnRvTG93ZXJDYXNlKCkgOiBwcmVJdGVtVmFsdWU7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtVmFsdWUuaW5kZXhPZihmaWx0ZXIpID4gLTE7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gISh0eXBlb2YgcmVzID09PSAndW5kZWZpbmVkJyk7XFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICAuLi5cXG4gICAgICAgICAgXV0+XFxuICAgICAgICAgICAgICAgICAgICA8L3ByZT5cXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LXRhYj5cXG4gICAgICAgICAgICAgICAgPC9tYXQtdGFiLWdyb3VwPlxcbiAgICAgICAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cXG4gICAgICAgICAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cXG4gICAgICAgIDwvbWF0LWNhcmQ+XFxuICAgICAgICA8bWF0LWNhcmQ+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLXRpdGxlIGNsYXNzPVxcXCJwYWQtYm90dG9tLXNtXFxcIiBpZD1cXFwiVGFibGVcXFwiPlRhYmxlIDxtYXQtaWNvbiBjbGFzcz1cXFwibGluay10by1jb21wb25lbnRcXFwiIHJvdXRlckxpbms9XFxcIi9cXFwiIGZyYWdtZW50PVxcXCJUYWJsZVxcXCI+bGluazwvbWF0LWljb24+PC9tYXQtY2FyZC10aXRsZT5cXG4gICAgICAgICAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cXG4gICAgICAgICAgICA8bWF0LWNhcmQtY29udGVudD5cXG4gICAgICAgICAgICAgICAgPHA+RXhhbXBsZSB0YWJsZSB3aXRoOiBQYWdpbmcgQmFyIC8gRmlsdGVyIC8gU29ydGFibGUgQ29sdW1ucyAvIE11bHRpLXNlbGVjdCB3aXRoIGF2YWlsYWJsZSBBY3Rpb25zPC9wPlxcbiAgICAgICAgICAgICAgICA8bWF0LXRhYi1ncm91cCBtYXQtc3RyZXRjaC10YWJzIGNvbG9yPVxcXCJhY2NlbnRcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPG1hdC10YWI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG1hdC10YWItbGFiZWw+RGVtbzwvbmctdGVtcGxhdGU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBsYXlvdXQ9XFxcInJvd1xcXCIgbGF5b3V0LWFsaWduPVxcXCJzcGFjZS1iZXR3ZWVuIGNlbnRlclxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVxcXCJwYWQtdG9wLW1kIHBhZC1ib3R0b20tc20gcGFkLWxlZnQtbWQgcGFkLXJpZ2h0LW1kXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcInRhYmxlLXRpdGxlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+VGFibGUgdGl0bGU8L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBmbGV4IGNsYXNzPVxcXCJwdXNoLXJpZ2h0LXNtXFxcIiBmeExheW91dD1cXFwicm93XFxcIiBmeExheW91dEFsaWduPVxcXCJlbmQgY2VudGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZC1jaGlwcyBbaXRlbXNdPVxcXCJhdXRvQ29tcGxldGVEYXRhXFxcIiAoYWRkKT1cXFwic2VhcmNoQWRkKCRldmVudClcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlbW92ZSk9XFxcInNlYXJjaFJlbW92ZSgkZXZlbnQpXFxcIj48L3RkLWNoaXBzPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cXFwicHVzaC10b3Atc21cXFwiIGNvbG9yPVxcXCJmZHMtcHJpbWFyeVxcXCIgbWF0LXJhaXNlZC1idXR0b25cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdE1lbnVUcmlnZ2VyRm9yXT1cXFwiZGF0YVRhYmxlQWN0aW9uTWVudVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uczxpIGNsYXNzPVxcXCJmYSBmYS1jYXJldC1kb3duXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCI+PC9pPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW1lbnUgY2xhc3M9XFxcImZkcy1wcmltYXJ5LWRyb3Bkb3duLWJ1dHRvbi1tZW51XFxcIiAjZGF0YVRhYmxlQWN0aW9uTWVudT1cXFwibWF0TWVudVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvdmVybGFwVHJpZ2dlcl09XFxcImZhbHNlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbT4gT3B0aW9uIDE8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbT4gT3B0aW9uIDI8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtbWVudT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYWQtbGVmdC1tZCBwYWQtcmlnaHQtbWRcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZ4TGF5b3V0PVxcXCJyb3dcXFwiIGZ4TGF5b3V0QWxpZ249XFxcInNwYWNlLWJldHdlZW4gY2VudGVyXFxcIiBjbGFzcz1cXFwidGQtZGF0YS10YWJsZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJ0ZC1kYXRhLXRhYmxlLWNvbHVtblxcXCIgKGNsaWNrKT1cXFwic29ydCgkZXZlbnQsIGNvbHVtbilcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cXFwiY29sdW1uLnRvb2x0aXBcXFwiICpuZ0Zvcj1cXFwibGV0IGNvbHVtbiBvZiBjb2x1bW5zXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmeEZsZXg9XFxcInt7Y29sdW1uLndpZHRofX1cXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpICpuZ0lmPVxcXCJjb2x1bW4uYWN0aXZlICYmIGNvbHVtbi5zb3J0YWJsZSAmJiBjb2x1bW4uc29ydE9yZGVyID09PSAnQVNDJ1xcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cXFwiZmEgZmEtY2FyZXQtdXBcXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIj48L2k+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgKm5nSWY9XFxcImNvbHVtbi5hY3RpdmUgJiYgY29sdW1uLnNvcnRhYmxlICYmIGNvbHVtbi5zb3J0T3JkZXIgPT09ICdERVNDJ1xcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cXFwiZmEgZmEtY2FyZXQtZG93blxcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiPjwvaT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NvbHVtbi5sYWJlbH19XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInRkLWRhdGEtdGFibGUtY29sdW1uXFxcIiBmeEZsZXg9MTA+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBmeExheW91dD1cXFwicm93XFxcIiBmeExheW91dEFsaWduPVxcXCJlbmQgY2VudGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGVja2JveCBjbGFzcz1cXFwicGFkLWxlZnQtc21cXFwiIFsobmdNb2RlbCldPVxcXCJhbGxSb3dzU2VsZWN0ZWRcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoZWNrZWQpPVxcXCJhbGxSb3dzU2VsZWN0ZWRcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XFxcInRvZ2dsZVNlbGVjdEFsbCgpXFxcIj48L21hdC1jaGVja2JveD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZnhMYXlvdXQ9XFxcInJvd1xcXCIgZnhMYXlvdXRBbGlnbj1cXFwic3BhY2UtYmV0d2VlbiBjZW50ZXJcXFwiIGNsYXNzPVxcXCJ0ZC1kYXRhLXRhYmxlLXJvd1xcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVxcXCJ7J3NlbGVjdGVkJyA6IHJvdy5jaGVja2VkfVxcXCIgKm5nRm9yPVxcXCJsZXQgcm93IG9mIGZpbHRlcmVkRGF0YVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cXFwicm93LmNoZWNrZWQgPSAhcm93LmNoZWNrZWQ7dG9nZ2xlU2VsZWN0KHJvdylcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInRkLWRhdGEtdGFibGUtY2VsbFxcXCIgKm5nRm9yPVxcXCJsZXQgY29sdW1uIG9mIGNvbHVtbnNcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmeEZsZXg9XFxcInt7Y29sdW1uLndpZHRofX1cXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVxcXCJjb2x1bW4ubmFtZSAhPT0gJ2NvbW1lbnRzJyB8fCByb3dbJ2NvbW1lbnRzJ11cXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjb2x1bW4uZm9ybWF0ID8gY29sdW1uLmZvcm1hdChyb3dbY29sdW1uLm5hbWVdKSA6IHJvd1tjb2x1bW4ubmFtZV19fVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJ0ZC1kYXRhLXRhYmxlLWNlbGxcXFwiIGZ4RmxleD0xMD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cXFwicm93LmFjdGlvbnNcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cXFwicm93LmFjdGlvbnMubGVuZ3RoIDw9IDRcXFwiIGZ4TGF5b3V0PVxcXCJyb3dcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ4TGF5b3V0QWxpZ249XFxcImVuZCBjZW50ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cXFwicm93LmNoZWNrZWQgPSAhcm93LmNoZWNrZWRcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XFxcImxldCBhY3Rpb24gb2Ygcm93LmFjdGlvbnNcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVxcXCJ7e2FjdGlvbi50b29sdGlwfX1cXFwiIG1hdC1pY29uLWJ1dHRvbiBjb2xvcj1cXFwiYWNjZW50XFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cXFwiYWN0aW9uLmRpc2FibGVkID8gJycgOiBudWxsXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XFxcInt7YWN0aW9uLmljb259fVxcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiPjwvaT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IGNsYXNzPVxcXCJwYWQtbGVmdC1zbVxcXCIgWyhuZ01vZGVsKV09XFxcInJvdy5jaGVja2VkXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVxcXCJyb3cuY2hlY2tlZFxcXCIgKGNoYW5nZSk9XFxcInRvZ2dsZVNlbGVjdChyb3cpXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cXFwicm93LmNoZWNrZWQgPSAhcm93LmNoZWNrZWQ7dG9nZ2xlU2VsZWN0KHJvdylcXFwiPjwvbWF0LWNoZWNrYm94PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVxcXCJyb3cuYWN0aW9ucy5sZW5ndGggPiA0XFxcIiBmeExheW91dD1cXFwicm93XFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmeExheW91dEFsaWduPVxcXCJlbmQgY2VudGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XFxcInJvdy5jaGVja2VkID0gIXJvdy5jaGVja2VkXFxcIiBtYXRUb29sdGlwPVxcXCJBY3Rpb25zXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uIGNvbG9yPVxcXCJhY2NlbnRcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVxcXCJ0YWJsZUFjdGlvbk1lbnVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cXFwiZmEgZmEtZWxsaXBzaXMtaFxcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiPjwvaT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW1lbnUgI3RhYmxlQWN0aW9uTWVudT1cXFwibWF0TWVudVxcXCIgW292ZXJsYXBUcmlnZ2VyXT1cXFwiZmFsc2VcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0Zvcj1cXFwibGV0IGFjdGlvbiBvZiByb3cuYWN0aW9uc1xcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVxcXCJ7e2FjdGlvbi50b29sdGlwfX1cXFwiIG1hdC1tZW51LWl0ZW1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVxcXCJhY3Rpb24uZGlzYWJsZWQgPyAnJyA6IG51bGxcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XFxcInt7YWN0aW9uLmljb259fVxcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiPjwvaT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7YWN0aW9uLm5hbWV9fTwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtbWVudT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IGNsYXNzPVxcXCJwYWQtbGVmdC1zbVxcXCIgWyhuZ01vZGVsKV09XFxcInJvdy5jaGVja2VkXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVxcXCJyb3cuY2hlY2tlZFxcXCIgKGNoYW5nZSk9XFxcInRvZ2dsZVNlbGVjdChyb3cpXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cXFwicm93LmNoZWNrZWQgPSAhcm93LmNoZWNrZWQ7dG9nZ2xlU2VsZWN0KHJvdylcXFwiPjwvbWF0LWNoZWNrYm94PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVxcXCIhcm93LmFjdGlvbnNcXFwiIGZ4TGF5b3V0PVxcXCJyb3dcXFwiIGZ4TGF5b3V0QWxpZ249XFxcImVuZCBjZW50ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGVja2JveCBjbGFzcz1cXFwicGFkLWxlZnQtc21cXFwiIFsobmdNb2RlbCldPVxcXCJyb3cuY2hlY2tlZFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVxcXCJyb3cuY2hlY2tlZFxcXCIgKGNoYW5nZSk9XFxcInRvZ2dsZVNlbGVjdChyb3cpXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVxcXCJyb3cuY2hlY2tlZCA9ICFyb3cuY2hlY2tlZDt0b2dnbGVTZWxlY3Qocm93KVxcXCI+PC9tYXQtY2hlY2tib3g+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtYXQtcGFkZGluZ1xcXCIgKm5nSWY9XFxcIiFmaWx0ZXJlZERhdGEubGVuZ3RoID4gMFxcXCIgbGF5b3V0PVxcXCJyb3dcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0LWFsaWduPVxcXCJjZW50ZXIgY2VudGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5ObyByZXN1bHRzIHRvIGRpc3BsYXkuPC9oMz5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZC1wYWdpbmctYmFyICNwYWdpbmdCYXIgW2luaXRpYWxQYWdlXT1cXFwiMVxcXCIgW3BhZ2VTaXplXT1cXFwicGFnZVNpemVcXFwiIFt0b3RhbF09XFxcInBhZ2VDb3VudFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XFxcInBhZ2UoJGV2ZW50KVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBoaWRlLXhzPlJvdyBwZXIgcGFnZTo8L3NwYW4+IHt7cGFnaW5nQmFyLnJhbmdlfX0gPHNwYW5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGUteHM+b2Yge3twYWdpbmdCYXIudG90YWx9fTwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZC1wYWdpbmctYmFyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtdGFiPlxcbiAgICAgICAgICAgICAgICAgICAgPG1hdC10YWI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG1hdC10YWItbGFiZWw+Q29kZTwvbmctdGVtcGxhdGU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPHA+SFRNTDo8L3A+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPHByZSBsYW5nPVxcXCJodG1sXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8IVtDREFUQVtcXG4gICAgICAgIDxkaXYgbGF5b3V0PVxcXCJyb3dcXFwiIGxheW91dC1hbGlnbj1cXFwic3BhY2UtYmV0d2VlbiBjZW50ZXJcXFwiIGNsYXNzPVxcXCJwYWQtdG9wLW1kIHBhZC1ib3R0b20tc20gcGFkLWxlZnQtbWQgcGFkLXJpZ2h0LW1kXFxcIj5cXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwidGFibGUtdGl0bGVcXFwiPlxcbiAgICAgICAgICAgIDxzcGFuPlRhYmxlIHRpdGxlPC9zcGFuPlxcbiAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICA8ZGl2IGZsZXggY2xhc3M9XFxcInB1c2gtcmlnaHQtc21cXFwiIGZ4TGF5b3V0PVxcXCJyb3dcXFwiIGZ4TGF5b3V0QWxpZ249XFxcImVuZCBjZW50ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICA8dGQtY2hpcHMgW2l0ZW1zXT1cXFwiYXV0b0NvbXBsZXRlRGF0YVxcXCIgKGFkZCk9XFxcInNlYXJjaEFkZCgkZXZlbnQpXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlbW92ZSk9XFxcInNlYXJjaFJlbW92ZSgkZXZlbnQpXFxcIj48L3RkLWNoaXBzPlxcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNvbG9yPVxcXCJmZHMtcHJpbWFyeVxcXCIgbWF0LXJhaXNlZC1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cXFwiZGF0YVRhYmxlQWN0aW9uTWVudVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICBBY3Rpb25zPGkgY2xhc3M9XFxcImZhIGZhLWNhcmV0LWRvd25cXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIj48L2k+XFxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDxtYXQtbWVudSBjbGFzcz1cXFwiZmRzLXByaW1hcnktZHJvcGRvd24tYnV0dG9uLW1lbnVcXFwiICNkYXRhVGFibGVBY3Rpb25NZW51PVxcXCJtYXRNZW51XFxcIiBbb3ZlcmxhcFRyaWdnZXJdPVxcXCJmYWxzZVxcXCI+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbT4gT3B0aW9uIDEgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbT4gT3B0aW9uIDIgPC9idXR0b24+XFxuICAgICAgICAgICAgPC9tYXQtbWVudT5cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFkLWxlZnQtbWQgcGFkLXJpZ2h0LW1kXFxcIj5cXG4gICAgICAgICAgICA8ZGl2IGZ4TGF5b3V0PVxcXCJyb3dcXFwiIGZ4TGF5b3V0QWxpZ249XFxcInNwYWNlLWJldHdlZW4gY2VudGVyXFxcIiBjbGFzcz1cXFwidGQtZGF0YS10YWJsZVxcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInRkLWRhdGEtdGFibGUtY29sdW1uXFxcIiAoY2xpY2spPVxcXCJzb3J0KCRldmVudCwgY29sdW1uKVxcXCIgW21hdFRvb2x0aXBdPVxcXCJjb2x1bW4udG9vbHRpcFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XFxcImxldCBjb2x1bW4gb2YgY29sdW1uc1xcXCIgZnhGbGV4PVxcXCJ7IHsgY29sdW1uLndpZHRoIH0gfVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICB7IHsgY29sdW1uLmxhYmVsIH0gfVxcbiAgICAgICAgICAgICAgICAgICAgPGkgKm5nSWY9XFxcImNvbHVtbi5hY3RpdmUgJiYgY29sdW1uLnNvcnRhYmxlICYmIGNvbHVtbi5zb3J0T3JkZXIgPT09ICdBU0MnXFxcIiBjbGFzcz1cXFwiZmEgZmEtY2FyZXQtdXBcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCI+PC9pPlxcbiAgICAgICAgICAgICAgICAgICAgPGkgKm5nSWY9XFxcImNvbHVtbi5hY3RpdmUgJiYgY29sdW1uLnNvcnRhYmxlICYmIGNvbHVtbi5zb3J0T3JkZXIgPT09ICdERVNDJ1xcXCIgY2xhc3M9XFxcImZhIGZhLWNhcmV0LWRvd25cXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCI+PC9pPlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwidGQtZGF0YS10YWJsZS1jb2x1bW5cXFwiIGZ4RmxleD0xMD5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZnhMYXlvdXQ9XFxcInJvd1xcXCIgZnhMYXlvdXRBbGlnbj1cXFwiZW5kIGNlbnRlclxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGVja2JveCBjbGFzcz1cXFwicGFkLWxlZnQtc21cXFwiIFsobmdNb2RlbCldPVxcXCJhbGxSb3dzU2VsZWN0ZWRcXFwiIChjaGVja2VkKT1cXFwiYWxsUm93c1NlbGVjdGVkXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XFxcInRvZ2dsZVNlbGVjdEFsbCgpXFxcIj48L21hdC1jaGVja2JveD5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8ZGl2PlxcbiAgICAgICAgICAgICAgICA8ZGl2IGZ4TGF5b3V0PVxcXCJyb3dcXFwiIGZ4TGF5b3V0QWxpZ249XFxcInNwYWNlLWJldHdlZW4gY2VudGVyXFxcIiBjbGFzcz1cXFwidGQtZGF0YS10YWJsZS1yb3dcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVxcXCJ7J3NlbGVjdGVkJyA6IHJvdy5jaGVja2VkfVxcXCIgKm5nRm9yPVxcXCJsZXQgcm93IG9mIGZpbHRlcmVkRGF0YVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVxcXCJyb3cuY2hlY2tlZCA9ICFyb3cuY2hlY2tlZDt0b2dnbGVTZWxlY3Qocm93KVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJ0ZC1kYXRhLXRhYmxlLWNlbGxcXFwiICpuZ0Zvcj1cXFwibGV0IGNvbHVtbiBvZiBjb2x1bW5zXFxcIiBmeEZsZXg9XFxcInsgeyBjb2x1bW4ud2lkdGggfSB9XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVxcXCJjb2x1bW4ubmFtZSAhPT0gJ2NvbW1lbnRzJyB8fCByb3dbJ2NvbW1lbnRzJ11cXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHsgY29sdW1uLmZvcm1hdCA/IGNvbHVtbi5mb3JtYXQocm93W2NvbHVtbi5uYW1lXSkgOiByb3dbY29sdW1uLm5hbWVdIH0gfVxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJ0ZC1kYXRhLXRhYmxlLWNlbGxcXFwiIGZ4RmxleD0xMD5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVxcXCJyb3cuYWN0aW9uc1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XFxcInJvdy5hY3Rpb25zLmxlbmd0aCA8PSA0XFxcIiBmeExheW91dD1cXFwicm93XFxcIiBmeExheW91dEFsaWduPVxcXCJlbmQgY2VudGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cXFwicm93LmNoZWNrZWQgPSAhcm93LmNoZWNrZWRcXFwiICpuZ0Zvcj1cXFwibGV0IGFjdGlvbiBvZiByb3cuYWN0aW9uc1xcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cXFwieyB7IGFjdGlvbi50b29sdGlwIH0gfVxcXCIgbWF0LWljb24tYnV0dG9uIGNvbG9yPVxcXCJhY2NlbnRcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XFxcImFjdGlvbi5kaXNhYmxlZCA/ICcnIDogbnVsbFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XFxcInsgeyBhY3Rpb24uaWNvbiB9IH1cXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIj48L2k+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggY2xhc3M9XFxcInBhZC1sZWZ0LXNtXFxcIiBbKG5nTW9kZWwpXT1cXFwicm93LmNoZWNrZWRcXFwiIFtjaGVja2VkXT1cXFwicm93LmNoZWNrZWRcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVxcXCJ0b2dnbGVTZWxlY3Qocm93KVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cXFwicm93LmNoZWNrZWQgPSAhcm93LmNoZWNrZWQ7dG9nZ2xlU2VsZWN0KHJvdylcXFwiPjwvbWF0LWNoZWNrYm94PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cXFwicm93LmFjdGlvbnMubGVuZ3RoID4gNFxcXCIgZnhMYXlvdXQ9XFxcInJvd1xcXCIgZnhMYXlvdXRBbGlnbj1cXFwiZW5kIGNlbnRlclxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XFxcInJvdy5jaGVja2VkID0gIXJvdy5jaGVja2VkXFxcIiBtYXRUb29sdGlwPVxcXCJBY3Rpb25zXFxcIiBtYXQtaWNvbi1idXR0b25cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I9XFxcImFjY2VudFxcXCIgW21hdE1lbnVUcmlnZ2VyRm9yXT1cXFwidGFibGVBY3Rpb25NZW51XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cXFwiZmEgZmEtZWxsaXBzaXMtaFxcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiPjwvaT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1tZW51ICN0YWJsZUFjdGlvbk1lbnU9XFxcIm1hdE1lbnVcXFwiIFtvdmVybGFwVHJpZ2dlcl09XFxcImZhbHNlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0Zvcj1cXFwibGV0IGFjdGlvbiBvZiByb3cuYWN0aW9uc1xcXCIgbWF0VG9vbHRpcD1cXFwieyB7IGFjdGlvbi50b29sdGlwIH0gfVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1tZW51LWl0ZW0gW2Rpc2FibGVkXT1cXFwiYWN0aW9uLmRpc2FibGVkID8gJycgOiBudWxsXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XFxcInsgeyBhY3Rpb24uaWNvbiB9IH1cXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIj48L2k+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnsgeyBhY3Rpb24ubmFtZSB9IH08L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1tZW51PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGVja2JveCBjbGFzcz1cXFwicGFkLWxlZnQtc21cXFwiIFsobmdNb2RlbCldPVxcXCJyb3cuY2hlY2tlZFxcXCIgW2NoZWNrZWRdPVxcXCJyb3cuY2hlY2tlZFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XFxcInRvZ2dsZVNlbGVjdChyb3cpXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVxcXCJyb3cuY2hlY2tlZCA9ICFyb3cuY2hlY2tlZDt0b2dnbGVTZWxlY3Qocm93KVxcXCI+PC9tYXQtY2hlY2tib3g+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XFxcIiFyb3cuYWN0aW9uc1xcXCIgZnhMYXlvdXQ9XFxcInJvd1xcXCIgZnhMYXlvdXRBbGlnbj1cXFwiZW5kIGNlbnRlclxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggY2xhc3M9XFxcInBhZC1sZWZ0LXNtXFxcIiBbKG5nTW9kZWwpXT1cXFwicm93LmNoZWNrZWRcXFwiIFtjaGVja2VkXT1cXFwicm93LmNoZWNrZWRcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XFxcInRvZ2dsZVNlbGVjdChyb3cpXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XFxcInJvdy5jaGVja2VkID0gIXJvdy5jaGVja2VkO3RvZ2dsZVNlbGVjdChyb3cpXFxcIj48L21hdC1jaGVja2JveD5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtYXQtcGFkZGluZ1xcXCIgKm5nSWY9XFxcIiFmaWx0ZXJlZERhdGEubGVuZ3RoID4gMFxcXCIgbGF5b3V0PVxcXCJyb3dcXFwiIGxheW91dC1hbGlnbj1cXFwiY2VudGVyIGNlbnRlclxcXCI+XFxuICAgICAgICAgICAgICAgIDxoMz5ObyByZXN1bHRzIHRvIGRpc3BsYXkuPC9oMz5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8dGQtcGFnaW5nLWJhciAjcGFnaW5nQmFyIFtpbml0aWFsUGFnZV09XFxcIjFcXFwiIFtwYWdlU2l6ZV09XFxcInBhZ2VTaXplXFxcIiBbdG90YWxdPVxcXCJwYWdlQ291bnRcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XFxcInBhZ2UoJGV2ZW50KVxcXCI+XFxuICAgICAgICAgICAgICAgIDxzcGFuIGhpZGUteHM+Um93IHBlciBwYWdlOjwvc3Bhbj4geyB7IHBhZ2luZ0Jhci5yYW5nZSB9IH0gPHNwYW4gaGlkZS14cz5vZiB7XFxuICAgICAgICAgICAgICAgIHsgcGFnaW5nQmFyLnRvdGFsIH0gfTwvc3Bhbj5cXG4gICAgICAgICAgICA8L3RkLXBhZ2luZy1iYXI+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgXV0+XFxuICAgICAgICAgICAgICAgICAgICA8L3ByZT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8cD5KYXZhc2NyaXB0OjwvcD5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8cHJlIGxhbmc9XFxcImphdmFzY3JpcHRcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhW0NEQVRBW1xcbiAgICAgICAgdGhpcy5kYXRhVGFibGVTZXJ2aWNlID0gVGREYXRhVGFibGVTZXJ2aWNlO1xcblxcbiAgICAgICAgdGhpcy5kYXRhID0gW1xcbiAgICAgICAgICAgIHtcXG4gICAgICAgICAgICAgICAgJ2lkJzogMSxcXG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnRnJvemVuIHlvZ3VydCcsXFxuICAgICAgICAgICAgICAgICd0eXBlJzogJ0ljZSBjcmVhbScsXFxuICAgICAgICAgICAgICAgICdjYWxvcmllcyc6IDE1OS4wLFxcbiAgICAgICAgICAgICAgICAnZmF0JzogNi4wLFxcbiAgICAgICAgICAgICAgICAnY2FyYnMnOiAyNC4wLFxcbiAgICAgICAgICAgICAgICAncHJvdGVpbic6IDQuMCxcXG4gICAgICAgICAgICAgICAgJ3NvZGl1bSc6IDg3LjAsXFxuICAgICAgICAgICAgICAgICdjYWxjaXVtJzogMTQuMCxcXG4gICAgICAgICAgICAgICAgJ2lyb24nOiAxLjAsXFxuICAgICAgICAgICAgICAgICdjb21tZW50cyc6ICdJIGxvdmUgZnJveW8hJyxcXG4gICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbXFxuICAgICAgICAgICAgICAgICAgICB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnQWN0aW9uIDEnLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICdpY29uJzogJ2ZhIGZhLXVzZXInLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICd0b29sdGlwJzogJ01hbmFnZSBVc2VycydcXG4gICAgICAgICAgICAgICAgICAgIH0sIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdBY3Rpb24gMicsXFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2ljb24nOiAnZmEgZmEta2V5JyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAndG9vbHRpcCc6ICdNYW5hZ2UgUGVybWlzc2lvbnMnXFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIF1cXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHtcXG4gICAgICAgICAgICAgICAgJ2lkJzogMixcXG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnSWNlIGNyZWFtIHNhbmR3aWNoJyxcXG4gICAgICAgICAgICAgICAgJ3R5cGUnOiAnSWNlIGNyZWFtJyxcXG4gICAgICAgICAgICAgICAgJ2NhbG9yaWVzJzogMjM3LjAsXFxuICAgICAgICAgICAgICAgICdmYXQnOiA5LjAsXFxuICAgICAgICAgICAgICAgICdjYXJicyc6IDM3LjAsXFxuICAgICAgICAgICAgICAgICdwcm90ZWluJzogNC4zLFxcbiAgICAgICAgICAgICAgICAnc29kaXVtJzogMTI5LjAsXFxuICAgICAgICAgICAgICAgICdjYWxjaXVtJzogOC4wLFxcbiAgICAgICAgICAgICAgICAnaXJvbic6IDEuMCxcXG4gICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbXFxuICAgICAgICAgICAgICAgICAgICB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnQWN0aW9uIDEnLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICdpY29uJzogJ2ZhIGZhLXVzZXInLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICd0b29sdGlwJzogJ01hbmFnZSBVc2VycydcXG4gICAgICAgICAgICAgICAgICAgIH0sIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdBY3Rpb24gMicsXFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2ljb24nOiAnZmEgZmEta2V5JyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAndG9vbHRpcCc6ICdNYW5hZ2UgUGVybWlzc2lvbnMnXFxuICAgICAgICAgICAgICAgICAgICB9LCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnQWN0aW9uIDMnLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICd0b29sdGlwJzogJ0FjdGlvbiAzJ1xcbiAgICAgICAgICAgICAgICAgICAgfSwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ0FjdGlvbiA0JyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAnZGlzYWJsZWQnOiB0cnVlLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICd0b29sdGlwJzogJ0FjdGlvbiA0J1xcbiAgICAgICAgICAgICAgICAgICAgfSwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ0FjdGlvbiA1JyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAndG9vbHRpcCc6ICdBY3Rpb24gNSdcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgXVxcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAge1xcbiAgICAgICAgICAgICAgICAnaWQnOiAzLFxcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdFY2xhaXInLFxcbiAgICAgICAgICAgICAgICAndHlwZSc6ICdQYXN0cnknLFxcbiAgICAgICAgICAgICAgICAnY2Fsb3JpZXMnOiAyNjIuMCxcXG4gICAgICAgICAgICAgICAgJ2ZhdCc6IDE2LjAsXFxuICAgICAgICAgICAgICAgICdjYXJicyc6IDI0LjAsXFxuICAgICAgICAgICAgICAgICdwcm90ZWluJzogNi4wLFxcbiAgICAgICAgICAgICAgICAnc29kaXVtJzogMzM3LjAsXFxuICAgICAgICAgICAgICAgICdjYWxjaXVtJzogNi4wLFxcbiAgICAgICAgICAgICAgICAnaXJvbic6IDcuMCxcXG4gICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ0FjdGlvbiAxJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAnaWNvbic6ICdmYSBmYS11c2VyJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAndG9vbHRpcCc6ICdNYW5hZ2UgVXNlcnMnXFxuICAgICAgICAgICAgICAgICAgICB9LCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnQWN0aW9uIDInLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICdpY29uJzogJ2ZhIGZhLWtleScsXFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3Rvb2x0aXAnOiAnTWFuYWdlIFBlcm1pc3Npb25zJ1xcbiAgICAgICAgICAgICAgICAgICAgfSwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ0FjdGlvbiAzJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAndG9vbHRpcCc6ICdBY3Rpb24gMydcXG4gICAgICAgICAgICAgICAgICAgIH0sIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdBY3Rpb24gNCcsXFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2Rpc2FibGVkJzogdHJ1ZSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAndG9vbHRpcCc6ICdBY3Rpb24gNCdcXG4gICAgICAgICAgICAgICAgICAgIH0sIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdBY3Rpb24gNScsXFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3Rvb2x0aXAnOiAnQWN0aW9uIDUnXFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIF0sXFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICB7XFxuICAgICAgICAgICAgICAgICdpZCc6IDQsXFxuICAgICAgICAgICAgICAgICduYW1lJzogJ0N1cGNha2UnLFxcbiAgICAgICAgICAgICAgICAndHlwZSc6ICdQYXN0cnknLFxcbiAgICAgICAgICAgICAgICAnY2Fsb3JpZXMnOiAzMDUuMCxcXG4gICAgICAgICAgICAgICAgJ2ZhdCc6IDMuNyxcXG4gICAgICAgICAgICAgICAgJ2NhcmJzJzogNjcuMCxcXG4gICAgICAgICAgICAgICAgJ3Byb3RlaW4nOiA0LjMsXFxuICAgICAgICAgICAgICAgICdzb2RpdW0nOiA0MTMuMCxcXG4gICAgICAgICAgICAgICAgJ2NhbGNpdW0nOiAzLjAsXFxuICAgICAgICAgICAgICAgICdpcm9uJzogOC4wLFxcbiAgICAgICAgICAgICAgICAnYWN0aW9ucyc6IFt7XFxuICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnQWN0aW9uIDEnLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICdpY29uJzogJ2ZhIGZhLXVzZXInLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICd0b29sdGlwJzogJ01hbmFnZSBVc2VycydcXG4gICAgICAgICAgICAgICAgICAgIH0sIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdBY3Rpb24gMicsXFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2ljb24nOiAnZmEgZmEta2V5JyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAndG9vbHRpcCc6ICdNYW5hZ2UgUGVybWlzc2lvbnMnXFxuICAgICAgICAgICAgICAgICAgICB9LCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnQWN0aW9uIDMnLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICd0b29sdGlwJzogJ0FjdGlvbiAzJ1xcbiAgICAgICAgICAgICAgICAgICAgfSwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ0FjdGlvbiA0JyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAnZGlzYWJsZWQnOiB0cnVlLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICd0b29sdGlwJzogJ0FjdGlvbiA0J1xcbiAgICAgICAgICAgICAgICAgICAgfSwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ0FjdGlvbiA1JyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAndG9vbHRpcCc6ICdBY3Rpb24gNSdcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgXSxcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHtcXG4gICAgICAgICAgICAgICAgJ2lkJzogNSxcXG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnSmVsbHkgYmVhbicsXFxuICAgICAgICAgICAgICAgICd0eXBlJzogJ0NhbmR5JyxcXG4gICAgICAgICAgICAgICAgJ2NhbG9yaWVzJzogMzc1LjAsXFxuICAgICAgICAgICAgICAgICdmYXQnOiAwLjAsXFxuICAgICAgICAgICAgICAgICdjYXJicyc6IDk0LjAsXFxuICAgICAgICAgICAgICAgICdwcm90ZWluJzogMC4wLFxcbiAgICAgICAgICAgICAgICAnc29kaXVtJzogNTAuMCxcXG4gICAgICAgICAgICAgICAgJ2NhbGNpdW0nOiAwLjAsXFxuICAgICAgICAgICAgICAgICdpcm9uJzogMC4wLFxcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAge1xcbiAgICAgICAgICAgICAgICAnaWQnOiA2LFxcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdMb2xsaXBvcCcsXFxuICAgICAgICAgICAgICAgICd0eXBlJzogJ0NhbmR5JyxcXG4gICAgICAgICAgICAgICAgJ2NhbG9yaWVzJzogMzkyLjAsXFxuICAgICAgICAgICAgICAgICdmYXQnOiAwLjIsXFxuICAgICAgICAgICAgICAgICdjYXJicyc6IDk4LjAsXFxuICAgICAgICAgICAgICAgICdwcm90ZWluJzogMC4wLFxcbiAgICAgICAgICAgICAgICAnc29kaXVtJzogMzguMCxcXG4gICAgICAgICAgICAgICAgJ2NhbGNpdW0nOiAwLjAsXFxuICAgICAgICAgICAgICAgICdpcm9uJzogMi4wLFxcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAge1xcbiAgICAgICAgICAgICAgICAnaWQnOiA3LFxcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdIb25leWNvbWInLFxcbiAgICAgICAgICAgICAgICAndHlwZSc6ICdPdGhlcicsXFxuICAgICAgICAgICAgICAgICdjYWxvcmllcyc6IDQwOC4wLFxcbiAgICAgICAgICAgICAgICAnZmF0JzogMy4yLFxcbiAgICAgICAgICAgICAgICAnY2FyYnMnOiA4Ny4wLFxcbiAgICAgICAgICAgICAgICAncHJvdGVpbic6IDYuNSxcXG4gICAgICAgICAgICAgICAgJ3NvZGl1bSc6IDU2Mi4wLFxcbiAgICAgICAgICAgICAgICAnY2FsY2l1bSc6IDAuMCxcXG4gICAgICAgICAgICAgICAgJ2lyb24nOiA0NS4wLFxcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAge1xcbiAgICAgICAgICAgICAgICAnaWQnOiA4LFxcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdEb251dCcsXFxuICAgICAgICAgICAgICAgICd0eXBlJzogJ1Bhc3RyeScsXFxuICAgICAgICAgICAgICAgICdjYWxvcmllcyc6IDQ1Mi4wLFxcbiAgICAgICAgICAgICAgICAnZmF0JzogMjUuMCxcXG4gICAgICAgICAgICAgICAgJ2NhcmJzJzogNTEuMCxcXG4gICAgICAgICAgICAgICAgJ3Byb3RlaW4nOiA0LjksXFxuICAgICAgICAgICAgICAgICdzb2RpdW0nOiAzMjYuMCxcXG4gICAgICAgICAgICAgICAgJ2NhbGNpdW0nOiAyLjAsXFxuICAgICAgICAgICAgICAgICdpcm9uJzogMjIuMCxcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHtcXG4gICAgICAgICAgICAgICAgJ2lkJzogOSxcXG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnS2l0S2F0JyxcXG4gICAgICAgICAgICAgICAgJ3R5cGUnOiAnQ2FuZHknLFxcbiAgICAgICAgICAgICAgICAnY2Fsb3JpZXMnOiA1MTguMCxcXG4gICAgICAgICAgICAgICAgJ2ZhdCc6IDI2LjAsXFxuICAgICAgICAgICAgICAgICdjYXJicyc6IDY1LjAsXFxuICAgICAgICAgICAgICAgICdwcm90ZWluJzogNy4wLFxcbiAgICAgICAgICAgICAgICAnc29kaXVtJzogNTQuMCxcXG4gICAgICAgICAgICAgICAgJ2NhbGNpdW0nOiAxMi4wLFxcbiAgICAgICAgICAgICAgICAnaXJvbic6IDYuMCxcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHtcXG4gICAgICAgICAgICAgICAgJ2lkJzogMTAsXFxuICAgICAgICAgICAgICAgICduYW1lJzogJ0Nob2NvbGF0ZScsXFxuICAgICAgICAgICAgICAgICd0eXBlJzogJ0NhbmR5JyxcXG4gICAgICAgICAgICAgICAgJ2NhbG9yaWVzJzogNTE4LjAsXFxuICAgICAgICAgICAgICAgICdmYXQnOiAyNi4wLFxcbiAgICAgICAgICAgICAgICAnY2FyYnMnOiA2NS4wLFxcbiAgICAgICAgICAgICAgICAncHJvdGVpbic6IDcuMCxcXG4gICAgICAgICAgICAgICAgJ3NvZGl1bSc6IDU0LjAsXFxuICAgICAgICAgICAgICAgICdjYWxjaXVtJzogMTIuMCxcXG4gICAgICAgICAgICAgICAgJ2lyb24nOiA2LjAsXFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICB7XFxuICAgICAgICAgICAgICAgICdpZCc6IDExLFxcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdDaGFtb3knLFxcbiAgICAgICAgICAgICAgICAndHlwZSc6ICdDYW5keScsXFxuICAgICAgICAgICAgICAgICdjYWxvcmllcyc6IDUxOC4wLFxcbiAgICAgICAgICAgICAgICAnZmF0JzogMjYuMCxcXG4gICAgICAgICAgICAgICAgJ2NhcmJzJzogNjUuMCxcXG4gICAgICAgICAgICAgICAgJ3Byb3RlaW4nOiA3LjAsXFxuICAgICAgICAgICAgICAgICdzb2RpdW0nOiA1NC4wLFxcbiAgICAgICAgICAgICAgICAnY2FsY2l1bSc6IDEyLjAsXFxuICAgICAgICAgICAgICAgICdpcm9uJzogNi4wLFxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIF07XFxuXFxuICAgICAgICB0aGlzLmZpbHRlcmVkRGF0YSA9IHRoaXMuZGF0YTtcXG4gICAgICAgIHRoaXMuZmlsdGVyZWRUb3RhbCA9IHRoaXMuZGF0YS5sZW5ndGg7XFxuXFxuICAgICAgICB0aGlzLmNvbHVtbnMgPSBbXFxuICAgICAgICAgICAgeyBuYW1lOiAnY29tbWVudHMnLCBsYWJlbDogJ0NvbW1lbnRzJyB9LFxcbiAgICAgICAgICAgIHsgbmFtZTogJ25hbWUnLCBsYWJlbDogJ0Rlc3NlcnQgKDEwMGcgc2VydmluZyknLCBzb3J0YWJsZTogdHJ1ZSB9LFxcbiAgICAgICAgICAgIHsgbmFtZTogJ3R5cGUnLCBsYWJlbDogJ1R5cGUnLCBzb3J0YWJsZTogdHJ1ZSB9LFxcbiAgICAgICAgICAgIHsgbmFtZTogJ2NhbG9yaWVzJywgbGFiZWw6ICdDYWxvcmllcycsIG51bWVyaWM6IHRydWUsIGZvcm1hdDogTlVNQkVSX0ZPUk1BVCwgc29ydGFibGU6IHRydWUgfSxcXG4gICAgICAgICAgICB7IG5hbWU6ICdmYXQnLCBsYWJlbDogJ0ZhdCAoZyknLCBudW1lcmljOiB0cnVlLCBmb3JtYXQ6IERFQ0lNQUxfRk9STUFULCBzb3J0YWJsZTogdHJ1ZSB9LFxcbiAgICAgICAgICAgIHsgbmFtZTogJ2NhcmJzJywgbGFiZWw6ICdDYXJicyAoZyknLCBudW1lcmljOiB0cnVlLCBmb3JtYXQ6IE5VTUJFUl9GT1JNQVQsIHNvcnRhYmxlOiB0cnVlIH0sXFxuICAgICAgICAgICAge1xcbiAgICAgICAgICAgIG5hbWU6ICdwcm90ZWluJywgbGFiZWw6ICdQcm90ZWluIChnKScsIG51bWVyaWM6IHRydWUsIGZvcm1hdDogREVDSU1BTF9GT1JNQVQsIHNvcnRhYmxlOiB0cnVlIH0sXFxuICAgICAgICAgICAgeyBuYW1lOiAnc29kaXVtJywgbGFiZWw6ICdTb2RpdW0gKG1nKScsIG51bWVyaWM6IHRydWUsIGZvcm1hdDogTlVNQkVSX0ZPUk1BVCwgc29ydGFibGU6IHRydWUgfSxcXG4gICAgICAgICAgICB7bmFtZTogJ2NhbGNpdW0nLCBsYWJlbDogJ0NhbGNpdW0gKCUpJywgbnVtZXJpYzogdHJ1ZSwgZm9ybWF0OiBOVU1CRVJfRk9STUFULCBzb3J0YWJsZTogdHJ1ZSB9LFxcbiAgICAgICAgICAgIHsgbmFtZTogJ2lyb24nLCBsYWJlbDogJ0lyb24gKCUpJywgbnVtZXJpYzogdHJ1ZSwgZm9ybWF0OiBOVU1CRVJfRk9STUFUIH0sXFxuICAgICAgICBdO1xcblxcbiAgICAgICAgdGhpcy5hbGxSb3dzU2VsZWN0ZWQgPSBmYWxzZTtcXG4gICAgICAgIHRoaXMuYXV0b0NvbXBsZXRlRGF0YSA9IFtdO1xcbiAgICAgICAgdGhpcy5zZWxlY3RlZFJvd3MgPSBbXTtcXG5cXG4gICAgICAgIHRoaXMuc2VhcmNoVGVybSA9IFtdO1xcbiAgICAgICAgdGhpcy5mcm9tUm93ID0gMTtcXG4gICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xcbiAgICAgICAgdGhpcy5wYWdlU2l6ZSA9IDU7XFxuXFxuICAgICAgICAuLi5cXG5cXG4gICAgICAgIHNvcnQ6IGZ1bmN0aW9uKHNvcnRFdmVudCwgY29sdW1uKSB7XFxuICAgICAgICAgICAgaWYgKGNvbHVtbi5zb3J0YWJsZSkge1xcbiAgICAgICAgICAgICAgICB2YXIgc29ydEJ5ID0gY29sdW1uLm5hbWU7XFxuICAgICAgICAgICAgICAgIHZhciBzb3J0T3JkZXIgPSBjb2x1bW4uc29ydE9yZGVyID0gKGNvbHVtbi5zb3J0T3JkZXIgPT09ICdBU0MnKSA/ICdERVNDJyA6ICdBU0MnO1xcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcihzb3J0QnksIHNvcnRPcmRlcik7XFxuXFxuICAgICAgICAgICAgICAgIC8vb25seSBvbmUgY29sdW1uIGNhbiBiZSBhY3RpdmVseSBzb3J0ZWQgc28gd2UgcmVzZXQgYWxsIHRvIGluYWN0aXZlXFxuICAgICAgICAgICAgICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKGMgPT4gYy5hY3RpdmUgPSBmYWxzZSk7XFxuXFxuICAgICAgICAgICAgICAgIC8vYW5kIHNldCB0aGlzIGNvbHVtbiBhcyB0aGUgYWN0aXZlbHkgc29ydGVkIGNvbHVtblxcbiAgICAgICAgICAgICAgICBjb2x1bW4uYWN0aXZlID0gdHJ1ZTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgc2VhcmNoUmVtb3ZlOiBmdW5jdGlvbihzZWFyY2hUZXJtKSB7XFxuICAgICAgICAgICAgLy9vbmx5IHJlbW92ZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgc2VhcmNoIHRlcm1cXG4gICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLnNlYXJjaFRlcm0uaW5kZXhPZihzZWFyY2hUZXJtKTtcXG4gICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoVGVybS5zcGxpY2UoaW5kZXgsIDEpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB0aGlzLmZpbHRlcigpO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIHNlYXJjaEFkZDogZnVuY3Rpb24oc2VhcmNoVGVybSkge1xcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoVGVybS5wdXNoKHNlYXJjaFRlcm0pO1xcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyKCk7XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgcGFnZTogZnVuY3Rpb24ocGFnaW5nRXZlbnQpIHtcXG4gICAgICAgICAgICB0aGlzLmZyb21Sb3cgPSBwYWdpbmdFdmVudC5mcm9tUm93O1xcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSBwYWdpbmdFdmVudC5wYWdlO1xcbiAgICAgICAgICAgIHRoaXMucGFnZVNpemUgPSBwYWdpbmdFdmVudC5wYWdlU2l6ZTtcXG4gICAgICAgICAgICB0aGlzLmZpbHRlcigpO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIGZpbHRlckRhdGE6IGZ1bmN0aW9uKGRhdGEsIHNlYXJjaFRlcm0sIGlnbm9yZUNhc2UpIHtcXG4gICAgICAgICAgICB2YXIgZmllbGQgPSAnJztcXG4gICAgICAgICAgICBpZiAoc2VhcmNoVGVybS5pbmRleE9mKFxcXCI6XFxcIikgPiAtMSkge1xcbiAgICAgICAgICAgICAgICBmaWVsZCA9IHNlYXJjaFRlcm0uc3BsaXQoJzonKVswXS50cmltKCk7XFxuICAgICAgICAgICAgICAgIHNlYXJjaFRlcm0gPSBzZWFyY2hUZXJtLnNwbGl0KCc6JylbMV0udHJpbSgpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB2YXIgZmlsdGVyID0gc2VhcmNoVGVybSA/IChpZ25vcmVDYXNlID8gc2VhcmNoVGVybS50b0xvd2VyQ2FzZSgpIDogc2VhcmNoVGVybSkgOiAnJztcXG5cXG4gICAgICAgICAgICBpZiAoZmlsdGVyKSB7XFxuICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLmZpbHRlcihpdGVtID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIHZhciByZXMgPSBPYmplY3Qua2V5cyhpdGVtKS5maW5kKChrZXkpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuaW5kZXhPZihcXFwiLlxcXCIpID4gLTEpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9iakFycmF5ID0gZmllbGQuc3BsaXQoXFxcIi5cXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9iaiA9IGl0ZW07XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcnJheUxlbmd0aCA9IG9iakFycmF5Lmxlbmd0aDtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheUxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaiA9IG9ialtvYmpBcnJheVtpXV07XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcmVJdGVtVmFsdWUgPSAoJycgKyBvYmopO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbVZhbHVlID0gaWdub3JlQ2FzZSA/IHByZUl0ZW1WYWx1ZS50b0xvd2VyQ2FzZSgpIDogcHJlSXRlbVZhbHVlO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbVZhbHVlLmluZGV4T2YoZmlsdGVyKSA+IC0xO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgIT09IGZpZWxkICYmIGZpZWxkICE9PSAnJykge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcmVJdGVtVmFsdWUgPSAoJycgKyBpdGVtW2tleV0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbVZhbHVlID0gaWdub3JlQ2FzZSA/IHByZUl0ZW1WYWx1ZS50b0xvd2VyQ2FzZSgpIDogcHJlSXRlbVZhbHVlO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbVZhbHVlLmluZGV4T2YoZmlsdGVyKSA+IC0xO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEodHlwZW9mIHJlcyA9PT0gJ3VuZGVmaW5lZCcpO1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgZmlsdGVyOiBmdW5jdGlvbihzb3J0QnksIHNvcnRPcmRlcikge1xcbiAgICAgICAgICAgIGlmICh0aGlzLmFsbFJvd3NTZWxlY3RlZCkge1xcbiAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZVNlbGVjdEFsbCgpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB0aGlzLmRlc2VsZWN0QWxsKCk7XFxuICAgICAgICAgICAgdmFyIG5ld0RhdGEgPSB0aGlzLmRhdGE7XFxuXFxuICAgICAgICAgICAgaWYgKHRoaXMuc2VhcmNoVGVybS5sZW5ndGggPiAwKSB7XFxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zZWFyY2hUZXJtLmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgICAgICAvL2FjY291bnQgZm9yIGNvbHVtbi9maWVsZCBuYW1lIHNwZWNpZmljIHNlYXJjaCBzeW50YXhcXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlYXJjaFRlcm1baV0uaW5kZXhPZihcXFwiOlxcXCIpID4gLTEpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdEYXRhID0gdGhpcy5maWx0ZXJEYXRhKG5ld0RhdGEsIHRoaXMuc2VhcmNoVGVybVtpXS5zcGxpdCgnOicpWzFdLnRyaW0oKSwgdHJ1ZSwgdGhpcy5zZWFyY2hUZXJtW2ldLnNwbGl0KCc6JylbMF0udHJpbSgpKTtcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vb3RoZXJ3aXNlIHNlYXJjaCBhbGwgY2VsbHNcXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdEYXRhID0gdGhpcy5maWx0ZXJEYXRhKG5ld0RhdGEsIHRoaXMuc2VhcmNoVGVybVtpXSwgdHJ1ZSk7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBuZXdEYXRhID0gdGhpcy5kYXRhVGFibGVTZXJ2aWNlLmZpbHRlckRhdGEobmV3RGF0YSwgJycsIHRydWUpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB0aGlzLmZpbHRlcmVkVG90YWwgPSBuZXdEYXRhLmxlbmd0aDtcXG4gICAgICAgICAgICBuZXdEYXRhID0gdGhpcy5kYXRhVGFibGVTZXJ2aWNlLnNvcnREYXRhKG5ld0RhdGEsIHNvcnRCeSwgc29ydE9yZGVyKTtcXG4gICAgICAgICAgICBuZXdEYXRhID0gdGhpcy5kYXRhVGFibGVTZXJ2aWNlLnBhZ2VEYXRhKG5ld0RhdGEsIHRoaXMuZnJvbVJvdywgdGhpcy5jdXJyZW50UGFnZSAqIHRoaXMucGFnZVNpemUpO1xcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyZWREYXRhID0gbmV3RGF0YTtcXG4gICAgICAgICAgICB0aGlzLmdldEF1dG9Db21wbGV0ZURhdGEoKTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICB0b2dnbGVTZWxlY3Q6IGZ1bmN0aW9uKHJvdykge1xcbiAgICAgICAgICAgIGlmICghcm93LmNoZWNrZWQpIHtcXG4gICAgICAgICAgICAgICAgdGhpcy5hbGxSb3dzU2VsZWN0ZWQgPSBmYWxzZTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hbGxGaWx0ZXJlZFJvd3NTZWxlY3RlZCgpKSB7XFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFsbFJvd3NTZWxlY3RlZCA9IHRydWU7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFsbFJvd3NTZWxlY3RlZCA9IGZhbHNlO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIHRvZ2dsZVNlbGVjdEFsbDogZnVuY3Rpb24oKSB7XFxuICAgICAgICAgICAgdGhpcy5hbGxSb3dzU2VsZWN0ZWQgPSAhdGhpcy5hbGxSb3dzU2VsZWN0ZWQ7XFxuICAgICAgICAgICAgaWYgKHRoaXMuYWxsUm93c1NlbGVjdGVkKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0QWxsKCk7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgdGhpcy5kZXNlbGVjdEFsbCgpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBzZWxlY3RBbGw6IGZ1bmN0aW9uKCkge1xcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyZWREYXRhLmZvckVhY2goYyA9PiBjLmNoZWNrZWQgPSB0cnVlKTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBkZXNlbGVjdEFsbDogZnVuY3Rpb24oKSB7XFxuICAgICAgICAgICAgdGhpcy5maWx0ZXJlZERhdGEuZm9yRWFjaChjID0+IGMuY2hlY2tlZCA9IGZhbHNlKTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBhbGxGaWx0ZXJlZFJvd3NTZWxlY3RlZDogZnVuY3Rpb24oKSB7XFxuICAgICAgICAgICAgdmFyIGFsbEZpbHRlcmVkUm93c1NlbGVjdGVkID0gdHJ1ZTtcXG4gICAgICAgICAgICB0aGlzLmZpbHRlcmVkRGF0YS5mb3JFYWNoKGZ1bmN0aW9uKGMpIHtcXG4gICAgICAgICAgICAgICAgaWYgKGMuY2hlY2tlZCA9PT0gdW5kZWZpbmVkIHx8IGMuY2hlY2tlZCA9PT0gZmFsc2UpIHtcXG4gICAgICAgICAgICAgICAgICAgIGFsbEZpbHRlcmVkUm93c1NlbGVjdGVkID0gZmFsc2U7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG5cXG4gICAgICAgICAgICByZXR1cm4gYWxsRmlsdGVyZWRSb3dzU2VsZWN0ZWQ7XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgYXJlVG9vbHRpcHNPbjogZnVuY3Rpb24oKSB7XFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uc1swXS5oYXNPd25Qcm9wZXJ0eSgndG9vbHRpcCcpO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIHRvZ2dsZVRvb2x0aXBzOiBmdW5jdGlvbigpIHtcXG4gICAgICAgICAgICBpZiAodGhpcy5jb2x1bW5zWzBdLnRvb2x0aXApIHtcXG4gICAgICAgICAgICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goYyA9PiBkZWxldGUgYy50b29sdGlwKTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaChjID0+IGMudG9vbHRpcCA9IGBUaGlzIGlzICR7Yy5sYWJlbH0hYCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIG9wZW5EYXRhVGFibGVQcm9tcHQ6IGZ1bmN0aW9uKHJvdywgbmFtZSkge1xcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5vcGVuUHJvbXB0KHtcXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ0VudGVyIGNvbW1lbnQ/JyxcXG4gICAgICAgICAgICAgICAgdmFsdWU6IHJvd1tuYW1lXSxcXG4gICAgICAgICAgICB9KS5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSh2YWx1ZSA9PiB7XFxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XFxuICAgICAgICAgICAgICAgICAgICByb3dbbmFtZV0gPSB2YWx1ZTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pXFxuICAgICAgICB9LFxcblxcbiAgICAgICAgZ2V0QXV0b0NvbXBsZXRlRGF0YTogZnVuY3Rpb24oKSB7XFxuICAgICAgICAgICAgdGhpcy5hdXRvQ29tcGxldGVEYXRhID0gW107XFxuICAgICAgICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goYyA9PiB0aGlzLmZpbHRlcmVkRGF0YS5mb3JFYWNoKHIgPT4gKHJbYy5uYW1lLnRvTG93ZXJDYXNlKCldKSA/IHRoaXMuYXV0b0NvbXBsZXRlRGF0YS5wdXNoKHJbYy5uYW1lLnRvTG93ZXJDYXNlKCldLnRvU3RyaW5nKCkpOicnKSk7XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJlPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC10YWI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXRhYi1ncm91cD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jYXJkLWFjdGlvbnM+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0VG9vbHRpcD1cXFwiQ29sdW1uIGZpZWxkIG5hbWUgdG9vbHRpcHMgdG9nZ2xlLlxcXCIgbWF0LWJ1dHRvbiBjb2xvcj1cXFwicHJpbWFyeVxcXCIgKGNsaWNrKT1cXFwidG9nZ2xlVG9vbHRpcHMoKVxcXCIgY2xhc3M9XFxcInRleHQtdXBwZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9vbHRpcHMgKHt7YXJlVG9vbHRpcHNPbigpID8gJ09OJyA6ICdPRkYnfX0pXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2FyZC1hY3Rpb25zPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jYXJkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNhcmQ+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2FyZC10aXRsZSBjbGFzcz1cXFwicGFkLWJvdHRvbS1zbVxcXCIgaWQ9XFxcIkNoZWNrYm94ZXNcXFwiPkNoZWNrYm94IDxtYXQtaWNvbiBjbGFzcz1cXFwibGluay10by1jb21wb25lbnRcXFwiIHJvdXRlckxpbms9XFxcIi9cXFwiIGZyYWdtZW50PVxcXCJDaGVja2JveGVzXFxcIj5saW5rPC9tYXQtaWNvbj48L21hdC1jYXJkLXRpdGxlPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNhcmQtY29udGVudD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cXFwibWQtdGl0bGVcXFwiPkJhc2ljIFVzYWdlPC9oMz5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGlzdD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1saXN0LWl0ZW0gKm5nRm9yPVxcXCJsZXQgZ3JvY2VyeSBvZiBncm9jZXJpZXNcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IFtjaGVja2VkXT1cXFwiZ3JvY2VyeS5ib3VnaHRcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tncm9jZXJ5Lm5hbWV9fVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWxpc3QtaXRlbT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtbGlzdD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVxcXCJtZC10aXRsZVxcXCI+VXNhZ2U8L2gzPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+SFRNTDo8L3A+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgbGFuZz1cXFwiaHRtbFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IVtDREFUQVtcXG4gICAgICAgIDwhLS0gQmFzaWMgVXNhZ2UgLS0+XFxuICAgICAgICA8bWF0LWNoZWNrYm94IFtjaGVja2VkXT1cXFwiZ3JvY2VyeS5ib3VnaHRcXFwiPlxcbiAgICAgICAgICAgIHsge2dyb2NlcnkubmFtZX0gfVxcbiAgICAgICAgPC9tYXQtY2hlY2tib3g+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJlPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5KYXZhc2NyaXB0OjwvcD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByZSBsYW5nPVxcXCJqYXZhc2NyaXB0XFxcIj5cXG4gICAgICAgIDwhW0NEQVRBW1xcbiAgICAgICAgdGhpcy5ncm9jZXJpZXMgPSBbXFxuICAgICAgICAgICAge1xcbiAgICAgICAgICAgICAgICBib3VnaHQ6IHRydWUsXFxuICAgICAgICAgICAgICAgIG5hbWU6ICdTZWl0YW4nLFxcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAge1xcbiAgICAgICAgICAgICAgICBib3VnaHQ6IGZhbHNlLFxcbiAgICAgICAgICAgICAgICBuYW1lOiAnQWxtb25kIE1lYWwgRmxvdXInLFxcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAge1xcbiAgICAgICAgICAgICAgICBib3VnaHQ6IGZhbHNlLFxcbiAgICAgICAgICAgICAgICBuYW1lOiAnT3JnYW5pYyBFZ2dzJyxcXG4gICAgICAgICAgICB9XFxuICAgICAgICBdO1xcbiAgICAgICAgXV0+XFxuICAgICAgICAgICAgICAgICAgICA8L3ByZT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XFxcIm1kLXRpdGxlXFxcIj5Vc2FnZSB3aXRoaW4gRm9ybXM8L2gzPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGxheW91dD1cXFwicm93XFxcIiBsYXlvdXQtYWxpZ249XFxcInN0YXJ0IGNlbnRlclxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IGZsZXg9XFxcImluaXRpYWxcXFwiIFsobmdNb2RlbCldPVxcXCJ1c2VyLmFncmVlc1RvVE9TXFxcIiBuYW1lPVxcXCJhZ3JlZXNUb1RPU1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSSBhZ3JlZSB0byB0aGUgdGVybXNcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cXFwiZmRzLXNlY29uZGFyeVxcXCIgW2Rpc2FibGVkXT1cXFwiIXVzZXIuYWdyZWVzVG9UT1NcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVxcXCJwYWQtcmlnaHQtc21cXFwiIGNsYXNzPVxcXCJ0ZXh0LXVwcGVyXFxcIj5TaWduIFVwXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGxheW91dD1cXFwicm93XFxcIiBsYXlvdXQtYWxpZ249XFxcInN0YXJ0IGNlbnRlclxcXCIgY2xhc3M9XFxcInBhZC10b3Atc20gcGFkLWJvdHRvbS1zbVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IGxhYmVsUG9zaXRpb249XFxcImFmdGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJIGNvbWUgYWZ0ZXIgbXkgbGFiZWwuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jaGVja2JveD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGxheW91dD1cXFwicm93XFxcIiBsYXlvdXQtYWxpZ249XFxcInN0YXJ0IGNlbnRlclxcXCIgY2xhc3M9XFxcInBhZC10b3Atc20gcGFkLWJvdHRvbS1zbVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IGxhYmVsUG9zaXRpb249XFxcImJlZm9yZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSSBjb21lIGJlZm9yZSBteSBsYWJlbFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVxcXCJtZC10aXRsZVxcXCI+VXNhZ2U8L2gzPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwPkhUTUw6PC9wPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgbGFuZz1cXFwiaHRtbFxcXCI+XFxuICAgICAgICA8IVtDREFUQVtcXG4gICAgICAgIDwhLS0gVXNhZ2Ugd2l0aGluIEZvcm1zIC0tPlxcbiAgICAgICAgPGZvcm0+XFxuICAgICAgICAgICAgPGRpdiBsYXlvdXQ9XFxcInJvd1xcXCIgbGF5b3V0LWFsaWduPVxcXCJzdGFydCBjZW50ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IGZsZXg9XFxcImluaXRpYWxcXFwiIFsobmdNb2RlbCldPVxcXCJ1c2VyLmFncmVlc1RvVE9TXFxcIiBuYW1lPVxcXCJhZ3JlZXNUb1RPU1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICBJIGFncmVlIHRvIHRoZSB0ZXJtc1xcbiAgICAgICAgICAgICAgICA8L21hdC1jaGVja2JveD5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cXFwiZmRzLXNlY29uZGFyeVxcXCIgW2Rpc2FibGVkXT1cXFwiIXVzZXIuYWdyZWVzVG9UT1NcXFwiIGNsYXNzPVxcXCJwYWQtcmlnaHQtc21cXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XFxcInRleHQtdXBwZXJcXFwiPlNpZ24gVXA8L2J1dHRvbj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cXG4gICAgICAgICAgICA8ZGl2IGxheW91dD1cXFwicm93XFxcIiBsYXlvdXQtYWxpZ249XFxcInN0YXJ0IGNlbnRlclxcXCIgY2xhc3M9XFxcInBhZC10b3Atc20gcGFkLWJvdHRvbS1zbVxcXCI+XFxuICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggbGFiZWxQb3NpdGlvbj1cXFwiYWZ0ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgSSBjb21lIGFmdGVyIG15IGxhYmVsLlxcbiAgICAgICAgICAgICAgICA8L21hdC1jaGVja2JveD5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cXG4gICAgICAgICAgICA8ZGl2IGxheW91dD1cXFwicm93XFxcIiBsYXlvdXQtYWxpZ249XFxcInN0YXJ0IGNlbnRlclxcXCIgY2xhc3M9XFxcInBhZC10b3Atc20gcGFkLWJvdHRvbS1zbVxcXCI+XFxuICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggbGFiZWxQb3NpdGlvbj1cXFwiYmVmb3JlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIEkgY29tZSBiZWZvcmUgbXkgbGFiZWxcXG4gICAgICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XFxuICAgICAgICA8L2Zvcm0+XFxuICAgICAgICBdXT5cXG4gICAgICAgIDwvcHJlPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwPkphdmFzY3JpcHQ6PC9wPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgbGFuZz1cXFwiamF2YXNjcmlwdFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPCFbQ0RBVEFbXFxuICAgICAgICB0aGlzLnVzZXIgPSB7XFxuICAgICAgICAgICAgYWdyZWVzVG9UT1M6IGZhbHNlXFxuICAgICAgICB9O1xcbiAgICAgICAgICAgICAgICAgICAgICAgIF1dPlxcbiAgICAgICAgICAgICAgICAgICAgPC9wcmU+XFxuICAgICAgICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxcbiAgICAgICAgPC9tYXQtY2FyZD5cXG4gICAgICAgIDxtYXQtY2FyZD5cXG4gICAgICAgICAgICA8bWF0LWNhcmQtdGl0bGUgY2xhc3M9XFxcInBhZC1ib3R0b20tc21cXFwiIGlkPVxcXCJSYWRpb3NcXFwiPlJhZGlvcyA8bWF0LWljb24gY2xhc3M9XFxcImxpbmstdG8tY29tcG9uZW50XFxcIiByb3V0ZXJMaW5rPVxcXCIvXFxcIiBmcmFnbWVudD1cXFwiUmFkaW9zXFxcIj5saW5rPC9tYXQtaWNvbj48L21hdC1jYXJkLXRpdGxlPlxcbiAgICAgICAgICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxcbiAgICAgICAgICAgIDxtYXQtY2FyZC1jb250ZW50IGxheW91dD1cXFwicm93XFxcIj5cXG4gICAgICAgICAgICAgICAgPGRpdiBmbGV4PVxcXCI0OFxcXCIgY2xhc3M9XFxcInBhZC1yaWdodFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8IS0tIEJhc2ljIFJhZGlvcyAtLT5cXG4gICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cXFwibWQtdGl0bGVcXFwiPkJhc2ljIFJhZGlvczwvaDM+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LXJhZGlvLWdyb3VwIG5hbWU9XFxcImdyb3VwMVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1yYWRpby1idXR0b24gY2xhc3M9XFxcInBhZC1yaWdodC1zbVxcXCIgbmFtZT1cXFwiZ3JvdXAxXFxcIj5PcHRpb24gMTwvbWF0LXJhZGlvLWJ1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiBjbGFzcz1cXFwicGFkLXJpZ2h0LXNtXFxcIiBuYW1lPVxcXCJncm91cDFcXFwiPk9wdGlvbiAyPC9tYXQtcmFkaW8tYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIGNsYXNzPVxcXCJwYWQtcmlnaHQtc21cXFwiIG5hbWU9XFxcImdyb3VwMVxcXCIgZGlzYWJsZWQ9XFxcInRydWVcXFwiPk9wdGlvbiAzIChkaXNhYmxlZClcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1yYWRpby1idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICA8L21hdC1yYWRpby1ncm91cD5cXG4gICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cXFwibWQtdGl0bGVcXFwiPlVzYWdlPC9oMz5cXG4gICAgICAgICAgICAgICAgICAgIDxwPkhUTUw6PC9wPlxcbiAgICAgICAgICAgICAgICAgICAgPHByZSBsYW5nPVxcXCJodG1sXFxcIj5cXG4gICAgICAgICAgICAgICAgPCFbQ0RBVEFbXFxuICAgICAgICA8IS0tIEJhc2ljIFJhZGlvcyAtLT5cXG4gICAgICAgIDxtYXQtcmFkaW8tZ3JvdXAgbmFtZT1cXFwiZ3JvdXAxXFxcIj5cXG4gICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiBjbGFzcz1cXFwicGFkLXJpZ2h0LXNtXFxcIiBuYW1lPVxcXCJncm91cDFcXFwiPk9wdGlvbiAxIDwvbWF0LXJhZGlvLWJ1dHRvbj5cXG4gICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiBjbGFzcz1cXFwicGFkLXJpZ2h0LXNtXFxcIiBuYW1lPVxcXCJncm91cDFcXFwiPk9wdGlvbiAyIDwvbWF0LXJhZGlvLWJ1dHRvbj5cXG4gICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiBjbGFzcz1cXFwicGFkLXJpZ2h0LXNtXFxcIiBuYW1lPVxcXCJncm91cDFcXFwiIGRpc2FibGVkPVxcXCJ0cnVlXFxcIj5PcHRpb24gMyAoZGlzYWJsZWQpIDwvbWF0LXJhZGlvLWJ1dHRvbj5cXG4gICAgICAgIDwvbWF0LXJhZGlvLWdyb3VwPlxcbiAgICAgICAgICAgICAgICBdXT5cXG4gICAgICAgIDwvcHJlPlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgPGRpdiBmbGV4PVxcXCI0OFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8IS0tIER5bmFtaWMgUmFkaW9zIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVxcXCJtZC10aXRsZVxcXCI+RHluYW1pYyBSYWRpb3M8L2gzPlxcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1yYWRpby1ncm91cCBuYW1lPVxcXCJtb3JlX29wdGlvbnNcXFwiIFsobmdNb2RlbCldPVxcXCJmYXZvcml0ZVNlYXNvblxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1yYWRpby1idXR0b24gY2xhc3M9XFxcImZkcy1yYWRpbyBwYWQtcmlnaHQtc21cXFwiICpuZ0Zvcj1cXFwibGV0IHNlYXNvbiBvZiBzZWFzb25PcHRpb25zXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XFxcIm1vcmVfb3B0aW9uc1xcXCIgW3ZhbHVlXT1cXFwic2Vhc29uXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tzZWFzb259fVxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXJhZGlvLWJ1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LXJhZGlvLWdyb3VwPlxcbiAgICAgICAgICAgICAgICAgICAgPHA+WW91ciBmYXZvcml0ZSBzZWFzb24gaXM6IDxzdHJvbmc+e3tmYXZvcml0ZVNlYXNvbn19PC9zdHJvbmc+PC9wPlxcbiAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVxcXCJtZC10aXRsZVxcXCI+VXNhZ2U8L2gzPlxcbiAgICAgICAgICAgICAgICAgICAgPHA+SFRNTDo8L3A+XFxuICAgICAgICAgICAgICAgICAgICA8cHJlIGxhbmc9XFxcImh0bWxcXFwiPlxcbiAgICAgIDwhW0NEQVRBW1xcbiAgICAgICAgPCEtLSBEeW5hbWljIFJhZGlvcyAtLT5cXG4gICAgICAgIDxtYXQtcmFkaW8tZ3JvdXAgbmFtZT1cXFwibW9yZV9vcHRpb25zXFxcIiBbKG5nTW9kZWwpXT1cXFwiZmF2b3JpdGVTZWFzb25cXFwiPlxcbiAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiBjbGFzcz1cXFwiZmRzLXJhZGlvXFxcIiAqbmdGb3I9XFxcImxldCBzZWFzb24gb2Ygc2Vhc29uT3B0aW9uc1xcXCIgbmFtZT1cXFwibW9yZV9vcHRpb25zXFxcIiBbdmFsdWVdPVxcXCJzZWFzb25cXFwiPlxcbiAgICAgICAgICAgIHsge3NlYXNvbn0gfVxcbiAgICAgICAgICA8L21hdC1yYWRpby1idXR0b24+XFxuICAgICAgICA8L21hdC1yYWRpby1ncm91cD5cXG4gICAgICAgIDxwPllvdXIgZmF2b3JpdGUgc2Vhc29uIGlzOiA8c3Ryb25nPnsgeyBmYXZvcml0ZVNlYXNvbiB9IH08L3N0cm9uZz48L3A+XFxuICAgICAgXV0+XFxuICAgICAgPC9wcmU+XFxuICAgICAgICAgICAgICAgICAgICA8cD5KYXZhc2NyaXB0OjwvcD5cXG4gICAgICAgICAgICAgICAgICAgIDxwcmUgbGFuZz1cXFwiamF2YXNjcmlwdFxcXCI+XFxuICAgICAgPCFbQ0RBVEFbXFxuXFxuICAgICAgICB0aGlzLmZhdm9yaXRlU2Vhc29uID0gJ0F1dHVtbic7XFxuXFxuICAgICAgICB0aGlzLnNlYXNvbk9wdGlvbnMgPSBbXFxuICAgICAgICAgICAgJ1dpbnRlcicsXFxuICAgICAgICAgICAgJ1NwcmluZycsXFxuICAgICAgICAgICAgJ1N1bW1lcicsXFxuICAgICAgICAgICAgJ0F1dHVtbicsXFxuICAgICAgICBdO1xcbiAgICAgIF1dPlxcbiAgICAgIDwvcHJlPlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICA8L21hdC1jYXJkPlxcbiAgICAgICAgPG1hdC1jYXJkPlxcbiAgICAgICAgICAgIDxtYXQtY2FyZC10aXRsZSBjbGFzcz1cXFwicGFkLWJvdHRvbS1zbVxcXCIgaWQ9XFxcIlRvb2x0aXBzXFxcIj5Ub29sdGlwcyA8bWF0LWljb24gY2xhc3M9XFxcImxpbmstdG8tY29tcG9uZW50XFxcIiByb3V0ZXJMaW5rPVxcXCIvXFxcIiBmcmFnbWVudD1cXFwiVG9vbHRpcHNcXFwiPmxpbms8L21hdC1pY29uPjwvbWF0LWNhcmQtdGl0bGU+XFxuICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XFxcImZkcy1wcmltYXJ5XFxcIiBtYXRUb29sdGlwPVxcXCJJIHNob3cgYWJvdmVcXFwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cXFwiYWJvdmVcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XFxcInRleHQtdXBwZXJcXFwiPkFib3ZlIFRvb2x0aXBcXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XFxcImZkcy1wcmltYXJ5XFxcIiBtYXRUb29sdGlwPVxcXCJJIHNob3cgYWZ0ZXJcXFwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cXFwiYWZ0ZXJcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XFxcInRleHQtdXBwZXJcXFwiPkFmdGVyIFRvb2x0aXBcXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XFxcImZkcy1wcmltYXJ5XFxcIiBtYXRUb29sdGlwPVxcXCJJIHNob3cgYmVsb3dcXFwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cXFwiYmVsb3dcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XFxcInRleHQtdXBwZXJcXFwiPkJlbG93IFRvb2x0aXBcXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XFxcImZkcy1wcmltYXJ5XFxcIiBtYXRUb29sdGlwPVxcXCJJIHNob3cgYmVmb3JlXFxcIiBtYXRUb29sdGlwUG9zaXRpb249XFxcImJlZm9yZVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cXFwidGV4dC11cHBlclxcXCI+QmVmb3JlIFRvb2x0aXBcXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cXFwibWQtdGl0bGVcXFwiPlVzYWdlPC9oMz5cXG4gICAgICAgICAgICAgICAgPHA+SFRNTDo8L3A+XFxuICAgICAgICAgICAgICAgIDxwcmUgbGFuZz1cXFwiaHRtbFxcXCI+XFxuICAgICAgPCFbQ0RBVEFbXFxuICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVxcXCJmZHMtcHJpbWFyeVxcXCIgbWF0VG9vbHRpcD1cXFwiSSBzaG93IGFib3ZlXFxcIiBtYXRUb29sdGlwUG9zaXRpb249XFxcImFib3ZlXFxcIlxcbiAgICAgICAgICAgICAgICBjbGFzcz1cXFwidGV4dC11cHBlclxcXCI+Qm90dG9tIFRvb2x0aXA8L2J1dHRvbj5cXG4gICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XFxcImZkcy1wcmltYXJ5XFxcIiBtYXRUb29sdGlwPVxcXCJJIHNob3cgYWZ0ZXJcXFwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cXFwiYWZ0ZXJcXFwiXFxuICAgICAgICAgICAgICAgIGNsYXNzPVxcXCJ0ZXh0LXVwcGVyXFxcIj5Cb3R0b20gVG9vbHRpcDwvYnV0dG9uPlxcbiAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cXFwiZmRzLXByaW1hcnlcXFwiIG1hdFRvb2x0aXA9XFxcIkkgc2hvdyBiZWxvd1xcXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVxcXCJiZWxvd1xcXCJcXG4gICAgICAgICAgICAgICAgY2xhc3M9XFxcInRleHQtdXBwZXJcXFwiPkJvdHRvbSBUb29sdGlwPC9idXR0b24+XFxuICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVxcXCJmZHMtcHJpbWFyeVxcXCIgbWF0VG9vbHRpcD1cXFwiSSBzaG93IGJlZm9yZVxcXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVxcXCJiZWZvcmVcXFwiXFxuICAgICAgICAgICAgICAgIGNsYXNzPVxcXCJ0ZXh0LXVwcGVyXFxcIj5Cb3R0b20gVG9vbHRpcDwvYnV0dG9uPlxcbiAgICAgICAgXV0+XFxuICAgICAgPC9wcmU+XFxuICAgICAgICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxcbiAgICAgICAgPC9tYXQtY2FyZD5cXG4gICAgICAgIDxtYXQtY2FyZD5cXG4gICAgICAgICAgICA8bWF0LWNhcmQtdGl0bGUgY2xhc3M9XFxcInBhZC1ib3R0b20tc21cXFwiIGlkPVxcXCJQYW5lbHNcXFwiPlBhbmVscyA8bWF0LWljb24gY2xhc3M9XFxcImxpbmstdG8tY29tcG9uZW50XFxcIiByb3V0ZXJMaW5rPVxcXCIvXFxcIiBmcmFnbWVudD1cXFwiUGFuZWxzXFxcIj5saW5rPC9tYXQtaWNvbj48L21hdC1jYXJkLXRpdGxlPlxcbiAgICAgICAgICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxcbiAgICAgICAgICAgIDxtYXQtY2FyZC1jb250ZW50PlxcbiAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XFxcIm1kLXRpdGxlXFxcIj5TdGFuZGFyZCBDYXJkPC9oMz5cXG4gICAgICAgICAgICAgICAgPG1hdC1jYXJkPlxcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cXFwiZmRzLXBhbmVsLW1lbnUtYnV0dG9uXFxcIiBtYXRUb29sdGlwPVxcXCJTdGFuZGFyZCBDYXJkIE1lbnVcXFwiIG1hdC1pY29uLWJ1dHRvblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVxcXCJzdGFuZGFyZENhcmRNZW51XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cXFwiZmEgZmEtZWxsaXBzaXMtdiBcXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIj48L2k+XFxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtbWVudSBjbGFzcz1cXFwicHJpbWFyeS1pY29uLWJ1dHRvbi1tZW51XFxcIiAjc3RhbmRhcmRDYXJkTWVudT1cXFwibWF0TWVudVxcXCIgW292ZXJsYXBUcmlnZ2VyXT1cXFwiZmFsc2VcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+T3B0aW9uMTwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPk9wdGlvbjI8L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICA8L21hdC1tZW51PlxcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1jYXJkLXRpdGxlIGNsYXNzPVxcXCJwYWQtYm90dG9tLXNtXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5UaXRsZTwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQtdGl0bGU+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LWNhcmQtY29udGVudD5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8cD5Mb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzY2luZyBlbGl0LCBzZWQgZG8gdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFV0IGVuaW0gYWQ8L3A+XFxuICAgICAgICAgICAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LWNhcmQtYWN0aW9ucyBmeExheW91dD1cXFwicm93XFxcIiBmeExheW91dEFsaWduPVxcXCJlbmQgY2VudGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVxcXCJmZHMtcHJpbWFyeVxcXCIgY2xhc3M9XFxcInRleHQtdXBwZXJcXFwiPkFjdGlvbjwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2FyZC1hY3Rpb25zPlxcbiAgICAgICAgICAgICAgICA8L21hdC1jYXJkPlxcbiAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XFxcIm1kLXRpdGxlXFxcIj5Vc2FnZTwvaDM+XFxuICAgICAgICAgICAgICAgIDxwPkhUTUw6PC9wPlxcbiAgICAgICAgICAgICAgICA8cHJlIGxhbmc9XFxcImh0bWxcXFwiPlxcbiAgICAgICAgICAgICAgICA8IVtDREFUQVtcXG4gICAgICAgIDwhLS0gQmFzaWMgQ2FyZCAtLT5cXG4gICAgICAgIDxtYXQtY2FyZD5cXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVxcXCJmZHMtcGFuZWwtbWVudS1idXR0b25cXFwiIG1hdFRvb2x0aXA9XFxcIlN0YW5kYXJkIENhcmQgTWVudVxcXCIgbWF0LWljb24tYnV0dG9uXFxuICAgICAgICAgICAgICAgICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVxcXCJzdGFuZGFyZENhcmRNZW51XFxcIj5cXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XFxcImZhIGZhLWVsbGlwc2lzLXYgXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCI+PC9pPlxcbiAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgIDxtYXQtbWVudSBjbGFzcz1cXFwicHJpbWFyeS1pY29uLWJ1dHRvbi1tZW51XFxcIiAjc3RhbmRhcmRDYXJkTWVudT1cXFwibWF0TWVudVxcXCIgW292ZXJsYXBUcmlnZ2VyXT1cXFwiZmFsc2VcXFwiPlxcbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0+XFxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5PcHRpb24xPC9zcGFuPlxcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtPlxcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+T3B0aW9uMjwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgPC9tYXQtbWVudT5cXG4gICAgICAgICAgICA8bWF0LWNhcmQtdGl0bGUgY2xhc3M9XFxcInBhZC1ib3R0b20tc21cXFwiPlxcbiAgICAgICAgICAgICAgICA8c3Bhbj5UaXRsZTwvc3Bhbj5cXG4gICAgICAgICAgICA8L21hdC1jYXJkLXRpdGxlPlxcbiAgICAgICAgICAgIDxtYXQtY2FyZC1jb250ZW50PlxcbiAgICAgICAgICAgICAgICA8cD5Mb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzY2luZyBlbGl0LCBzZWQgZG8gdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFV0IGVuaW0gYWQ8L3A+XFxuICAgICAgICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxcbiAgICAgICAgICAgIDxtYXQtY2FyZC1hY3Rpb25zIGZ4TGF5b3V0PVxcXCJyb3dcXFwiIGZ4TGF5b3V0QWxpZ249XFxcImVuZCBjZW50ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVxcXCJmZHMtcHJpbWFyeVxcXCIgY2xhc3M9XFxcInRleHQtdXBwZXJcXFwiPkFjdGlvbjwvYnV0dG9uPlxcbiAgICAgICAgICAgIDwvbWF0LWNhcmQtYWN0aW9ucz5cXG4gICAgICAgIDwvbWF0LWNhcmQ+XFxuICAgICAgICAgICAgICAgIF1dPlxcbiAgICAgICAgICAgIDwvcHJlPlxcbiAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XFxcIm1kLXRpdGxlXFxcIj5UYWJiZWQgQ2FyZDwvaDM+XFxuICAgICAgICAgICAgICAgIDxtYXQtY2FyZD5cXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XFxcImZkcy1wYW5lbC1tZW51LWJ1dHRvblxcXCIgbWF0VG9vbHRpcD1cXFwiU3RhbmRhcmQgQ2FyZCBNZW51XFxcIiBtYXQtaWNvbi1idXR0b25cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdE1lbnVUcmlnZ2VyRm9yXT1cXFwic3RhbmRhcmRDYXJkTWVudVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XFxcImZhIGZhLWVsbGlwc2lzLXYgXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCI+PC9pPlxcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LW1lbnUgY2xhc3M9XFxcInByaW1hcnktaWNvbi1idXR0b24tbWVudVxcXCIgI3N0YW5kYXJkQ2FyZE1lbnU9XFxcIm1hdE1lbnVcXFwiIFtvdmVybGFwVHJpZ2dlcl09XFxcImZhbHNlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPk9wdGlvbjE8L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5PcHRpb24yPC9zcGFuPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtbWVudT5cXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtY2FyZC1jb250ZW50PlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtdGFiLWdyb3VwIGR5bmFtaWNIZWlnaHQgY29sb3I9XFxcImFjY2VudFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtdGFiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG1hdC10YWItbGFiZWw+T25lPC9uZy10ZW1wbGF0ZT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cXFwibWQtdGl0bGVcXFwiPkZpcnN0IHRhYiBjb250ZW50PC9oMz5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlBsYWlkIGVjaG8gcGFyayBrbmF1c2dhYXJkIG5vcm1jb3JlIGZyYW56ZW4gY3JvbnV0LiBQaWNrbGVkIGh1bWJsZWJyYWcgdG9mdSBob29kaWUsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW1hbWkgc2FsdmlhIGZhcm0tdG8tdGFibGUgc2NobGl0eiB0cnktaGFyZCBmb29kIHRydWNrIGtuYXVzZ2FhcmQgcGFic3QuIFl1Y2NpZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRsYW5kIGplYW4gc2hvcnRzLCBhdXRoZW50aWMgbWl4dGFwZSB3YWlzdGNvYXQgZ2VudHJpZnkgYmx1ZSBib3R0bGUuIEZpeGllXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2lja3N0YXJ0ZXIgY2h1cmNoLWtleSBzbWFsbCBiYXRjaCBzZWl0YW4sIHNoYWJieSBjaGljIHZlZ2FuIGxpc3RpY2xlIGJlZm9yZSB0aGV5XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29sZCBvdXQuIEhhbW1vY2sgcmF3IGRlbmltIGZsYW5uZWwgdG91c2xlZCBzZWl0YW4geW91IHByb2JhYmx5IGhhdmVuJ3QgaGVhcmQgb2ZcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtLiBUcnVzdCBmdW5kIG1hbiBidW4gcHVnLCBraWNrc3RhcnRlciBhcnRpc2FuIHNlbHZhZ2UgbGV0dGVycHJlc3MgY29ybmhvbGUgdG90ZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhZyBidXRjaGVyIGxvY2F2b3JlLiBBZmZvZ2F0byB0cnktaGFyZCBraWNrc3RhcnRlciBzZWl0YW4sIERJWSBwaWNrbGVkIGhlbGxhIGdvZGFyZFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcmsgYmVsbHkgZm91ciBsb2tvIHVnaC48L3A+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXRhYj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC10YWI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbWF0LXRhYi1sYWJlbD5Ud288L25nLXRlbXBsYXRlPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVxcXCJtZC10aXRsZVxcXCI+U2Vjb25kIHRhYiBjb250ZW50PC9oMz5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkhhc2h0YWcgZGlzdGlsbGVyeSBza2F0ZWJvYXJkIG1hbiBidW4gZ29jaHVqYW5nLCBzYWx2aWEgbWFuIGJyYWlkIGFydCBwYXJ0eSBtZWdnaW5nc1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaXJsb29tIGtpdHNjaCBmYXJtLXRvLXRhYmxlLiBGcmFuemVuIGJlYXJkIGZpbmdlcnN0YWNoZSBnZW50cmlmeSwgaGVpcmxvb21cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0bGFuZCBlbm51aSBYT1hPIG1pY3JvZG9zaW5nIGtpdHNjaCBwbGFpZC4gQ2hpY2hhcnJvbmVzIGJ1c2h3aWNrIGNoaWEsIGJhbmggbWlcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcm9ueSB0YXR0b29lZCBoYW1tb2NrIGJ1dGNoZXIgc2hhYmJ5IGNoaWMgdGF4aWRlcm15IHNlbWlvdGljcyBtYXJmYSBwb3N0LWlyb25pYy5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVlIGJvdHRsZSBrZWZmaXllaCBmYXJtLXRvLXRhYmxlIGVubnVpLCBjaGFtYnJheSBwaXRjaGZvcmsgYXJ0IHBhcnR5IHBpbnRlcmVzdFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFydGlzYW4gcG9wLXVwLiBFdHN5IGJhbmpvIG1hcmZhLCBibHVlIGJvdHRsZSBrb21idWNoYSBjcnVjaWZpeCBYT1hPIHRvdXNsZWQgYmVhcmQuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlsZGUgZGlzcnVwdCBrYWxlIGNoaXBzIGJpY3ljbGUgcmlnaHRzIHNrYXRlYm9hcmQgbWFzdGVyIGNsZWFuc2UgaGVsbGEgc2hvcmVkaXRjaCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpdGF0aW9uIHJldHJvIHNoYWJieSBjaGljIHZpY2UgaGVpcmxvb20uIEV0c3kgbGlzdGljbGUgdmljZSBhY3R1YWxseSwgaVBob25lIGNoaWFcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob29kaWUgZm91ciBsb2tvLjwvcD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtdGFiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXRhYi1ncm91cD5cXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtY2FyZC1hY3Rpb25zIGZ4TGF5b3V0PVxcXCJyb3dcXFwiIGZ4TGF5b3V0QWxpZ249XFxcImVuZCBjZW50ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XFxcImZkcy1wcmltYXJ5XFxcIiBjbGFzcz1cXFwidGV4dC11cHBlclxcXCI+QWN0aW9uPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICA8L21hdC1jYXJkLWFjdGlvbnM+XFxuICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQ+XFxuICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cXFwibWQtdGl0bGVcXFwiPlVzYWdlPC9oMz5cXG4gICAgICAgICAgICAgICAgPHA+SFRNTDo8L3A+XFxuICAgICAgICAgICAgICAgIDxwcmUgbGFuZz1cXFwiaHRtbFxcXCI+XFxuICAgICAgICAgICAgICAgIDwhW0NEQVRBW1xcbiAgICAgICAgPCEtLSBCYXNpYyBDYXJkIC0tPlxcbiAgICAgICAgPG1hdC1jYXJkPlxcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XFxcImZkcy1wYW5lbC1tZW51LWJ1dHRvblxcXCIgbWF0VG9vbHRpcD1cXFwiU3RhbmRhcmQgQ2FyZCBNZW51XFxcIiBtYXQtaWNvbi1idXR0b25cXG4gICAgICAgICAgICAgICAgICAgIFttYXRNZW51VHJpZ2dlckZvcl09XFxcInN0YW5kYXJkQ2FyZE1lbnVcXFwiPlxcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cXFwiZmEgZmEtZWxsaXBzaXMtdiBcXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIj48L2k+XFxuICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgPG1hdC1tZW51IGNsYXNzPVxcXCJwcmltYXJ5LWljb24tYnV0dG9uLW1lbnVcXFwiICNzdGFuZGFyZENhcmRNZW51PVxcXCJtYXRNZW51XFxcIiBbb3ZlcmxhcFRyaWdnZXJdPVxcXCJmYWxzZVxcXCI+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbT5cXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPk9wdGlvbjE8L3NwYW4+XFxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0+XFxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5PcHRpb24yPC9zcGFuPlxcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICA8L21hdC1tZW51PlxcbiAgICAgICAgICAgIDxtYXQtY2FyZC1jb250ZW50PlxcbiAgICAgICAgICAgICAgICA8bWF0LXRhYi1ncm91cCBkeW5hbWljSGVpZ2h0IGNvbG9yPVxcXCJhY2NlbnRcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPG1hdC10YWI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG1hdC10YWItbGFiZWw+T25lPC9uZy10ZW1wbGF0ZT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XFxcIm1kLXRpdGxlXFxcIj5GaXJzdCB0YWIgY29udGVudDwvaDM+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPHA+UGxhaWQgZWNobyBwYXJrIGtuYXVzZ2FhcmQgbm9ybWNvcmUgZnJhbnplbiBjcm9udXQuIFBpY2tsZWQgaHVtYmxlYnJhZyB0b2Z1IGhvb2RpZSwgdW1hbWkgc2FsdmlhIGZhcm0tdG8tdGFibGUgc2NobGl0eiB0cnktaGFyZCBmb29kIHRydWNrIGtuYXVzZ2FhcmQgcGFic3QuIFl1Y2NpZSBwb3J0bGFuZCBqZWFuIHNob3J0cywgYXV0aGVudGljIG1peHRhcGUgd2Fpc3Rjb2F0IGdlbnRyaWZ5IGJsdWUgYm90dGxlLiBGaXhpZSBraWNrc3RhcnRlciBjaHVyY2gta2V5IHNtYWxsIGJhdGNoIHNlaXRhbiwgc2hhYmJ5IGNoaWMgdmVnYW4gbGlzdGljbGUgYmVmb3JlIHRoZXkgc29sZCBvdXQuIEhhbW1vY2sgcmF3IGRlbmltIGZsYW5uZWwgdG91c2xlZCBzZWl0YW4geW91IHByb2JhYmx5IGhhdmVuJ3QgaGVhcmQgb2YgdGhlbS4gVHJ1c3QgZnVuZCBtYW4gYnVuIHB1Zywga2lja3N0YXJ0ZXIgYXJ0aXNhbiBzZWx2YWdlIGxldHRlcnByZXNzIGNvcm5ob2xlIHRvdGUgYmFnIGJ1dGNoZXIgbG9jYXZvcmUuIEFmZm9nYXRvIHRyeS1oYXJkIGtpY2tzdGFydGVyIHNlaXRhbiwgRElZIHBpY2tsZWQgaGVsbGEgZ29kYXJkIHBvcmsgYmVsbHkgZm91ciBsb2tvIHVnaC48L3A+XFxuICAgICAgICAgICAgICAgICAgICA8L21hdC10YWI+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LXRhYj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbWF0LXRhYi1sYWJlbD5Ud288L25nLXRlbXBsYXRlPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cXFwibWQtdGl0bGVcXFwiPlNlY29uZCB0YWIgY29udGVudDwvaDM+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPHA+SGFzaHRhZyBkaXN0aWxsZXJ5IHNrYXRlYm9hcmQgbWFuIGJ1biBnb2NodWphbmcsIHNhbHZpYSBtYW4gYnJhaWQgYXJ0IHBhcnR5IG1lZ2dpbmdzIGhlaXJsb29tIGtpdHNjaCBmYXJtLXRvLXRhYmxlLiBGcmFuemVuIGJlYXJkIGZpbmdlcnN0YWNoZSBnZW50cmlmeSwgaGVpcmxvb20gcG9ydGxhbmQgZW5udWkgWE9YTyBtaWNyb2Rvc2luZyBraXRzY2ggcGxhaWQuIENoaWNoYXJyb25lcyBidXNod2ljayBjaGlhLCBiYW5oIG1pIGlyb255IHRhdHRvb2VkIGhhbW1vY2sgYnV0Y2hlciBzaGFiYnkgY2hpYyB0YXhpZGVybXkgc2VtaW90aWNzIG1hcmZhIHBvc3QtaXJvbmljLiBCbHVlIGJvdHRsZSBrZWZmaXllaCBmYXJtLXRvLXRhYmxlIGVubnVpLCBjaGFtYnJheSBwaXRjaGZvcmsgYXJ0IHBhcnR5IHBpbnRlcmVzdCBhcnRpc2FuIHBvcC11cC4gRXRzeSBiYW5qbyBtYXJmYSwgYmx1ZSBib3R0bGUga29tYnVjaGEgY3J1Y2lmaXggWE9YTyB0b3VzbGVkIGJlYXJkLiBUaWxkZSBkaXNydXB0IGthbGUgY2hpcHMgYmljeWNsZSByaWdodHMgc2thdGVib2FyZCBtYXN0ZXIgY2xlYW5zZSBoZWxsYSBzaG9yZWRpdGNoLCBtZWRpdGF0aW9uIHJldHJvIHNoYWJieSBjaGljIHZpY2UgaGVpcmxvb20uIEV0c3kgbGlzdGljbGUgdmljZSBhY3R1YWxseSwgaVBob25lIGNoaWEgaG9vZGllIGZvdXIgbG9rby48L3A+XFxuICAgICAgICAgICAgICAgICAgICA8L21hdC10YWI+XFxuICAgICAgICAgICAgICAgIDwvbWF0LXRhYi1ncm91cD5cXG4gICAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLWFjdGlvbnMgZnhMYXlvdXQ9XFxcInJvd1xcXCIgZnhMYXlvdXRBbGlnbj1cXFwiZW5kIGNlbnRlclxcXCI+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XFxcImZkcy1wcmltYXJ5XFxcIiBjbGFzcz1cXFwidGV4dC11cHBlclxcXCI+QWN0aW9uPC9idXR0b24+XFxuICAgICAgICAgICAgPC9tYXQtY2FyZC1hY3Rpb25zPlxcbiAgICAgICAgPC9tYXQtY2FyZD5cXG4gICAgICAgICAgICAgICAgXV0+XFxuICAgICAgICAgICAgPC9wcmU+XFxuICAgICAgICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxcbiAgICAgICAgPC9tYXQtY2FyZD5cXG4gICAgICAgIDxtYXQtY2FyZD5cXG4gICAgICAgICAgICA8bWF0LWNhcmQtdGl0bGUgY2xhc3M9XFxcInBhZC1ib3R0b20tc21cXFwiIGlkPVxcXCJTZWxlY3RcXFwiPlNlbGVjdCA8bWF0LWljb24gY2xhc3M9XFxcImxpbmstdG8tY29tcG9uZW50XFxcIiByb3V0ZXJMaW5rPVxcXCIvXFxcIiBmcmFnbWVudD1cXFwiU2VsZWN0XFxcIj5saW5rPC9tYXQtaWNvbj48L21hdC1jYXJkLXRpdGxlPlxcbiAgICAgICAgICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxcbiAgICAgICAgICAgIDxtYXQtY2FyZC1jb250ZW50PlxcbiAgICAgICAgICAgICAgICA8Zm9ybT5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgbGF5b3V0PVxcXCJyb3dcXFwiIGxheW91dC1tYXJnaW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgY29sb3I9XFxcImFjY2VudFxcXCIgZmxvYXRQbGFjZWhvbGRlcj1cXFwibmV2ZXJcXFwiIHBsYWNlaG9sZGVyPVxcXCJGYXZvcml0ZSBmb29kXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVxcXCJzZWxlY3RlZFZhbHVlXFxcIiBuYW1lPVxcXCJmb29kXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVxcXCJsZXQgZm9vZCBvZiBmb29kc1xcXCIgW3ZhbHVlXT1cXFwiZm9vZC52YWx1ZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2Zvb2Qudmlld1ZhbHVlfX1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBsYXlvdXQ9XFxcInJvd1xcXCIgbGF5b3V0LW1hcmdpbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZsZXg+IFNlbGVjdGVkIGZvb2QgdmFsdWU6IHt7c2VsZWN0ZWRWYWx1ZX19IDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgIDwvZm9ybT5cXG4gICAgICAgICAgICAgICAgPGgzIGNsYXNzPVxcXCJtZC10aXRsZVxcXCI+VXNhZ2U8L2gzPlxcbiAgICAgICAgICAgICAgICA8cD5IVE1MOjwvcD5cXG4gICAgICAgICAgICAgICAgPHByZSBsYW5nPVxcXCJodG1sXFxcIj5cXG4gICAgICA8IVtDREFUQVtcXG4gICAgICAgIDxmb3JtPlxcbiAgICAgICAgICAgIDxkaXYgbGF5b3V0PVxcXCJyb3dcXFwiIGxheW91dC1tYXJnaW4+XFxuICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0IGNvbG9yPVxcXCJhY2NlbnRcXFwiIGZsb2F0UGxhY2Vob2xkZXI9XFxcIm5ldmVyXFxcIiBwbGFjZWhvbGRlcj1cXFwiRmF2b3JpdGUgZm9vZFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XFxcInNlbGVjdGVkVmFsdWVcXFwiIG5hbWU9XFxcImZvb2RcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVxcXCJsZXQgZm9vZCBvZiBmb29kc1xcXCIgW3ZhbHVlXT1cXFwiZm9vZC52YWx1ZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgeyB7Zm9vZC52aWV3VmFsdWV9IH1cXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cXG4gICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDxkaXYgbGF5b3V0PVxcXCJyb3dcXFwiIGxheW91dC1tYXJnaW4+XFxuICAgICAgICAgICAgICAgIDxkaXYgZmxleD4gU2VsZWN0ZWQgZm9vZCB2YWx1ZTogeyB7c2VsZWN0ZWRWYWx1ZX0gfSA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZm9ybT5cXG4gICAgICAgIF1dPlxcbiAgICAgIDwvcHJlPlxcbiAgICAgICAgICAgICAgICA8cD5KYXZhc2NyaXB0OjwvcD5cXG4gICAgICAgICAgICAgICAgPHByZSBsYW5nPVxcXCJqYXZhc2NyaXB0XFxcIj5cXG4gICAgICA8IVtDREFUQVtcXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZSA9ICcnO1xcblxcbiAgICAgICAgdGhpcy5mb29kcyA9IFtcXG4gICAgICAgICAgICB7IHZhbHVlOiAnc3RlYWstMCcsIHZpZXdWYWx1ZTogJ1N0ZWFrJyB9LFxcbiAgICAgICAgICAgIHsgdmFsdWU6ICdwaXp6YS0xJywgdmlld1ZhbHVlOiAnUGl6emEnIH0sXFxuICAgICAgICAgICAgeyB2YWx1ZTogJ3RhY29zLTInLCB2aWV3VmFsdWU6ICdUYWNvcycgfSxcXG4gICAgICAgIF07XFxuICAgICAgICBdXT5cXG4gICAgICA8L3ByZT5cXG4gICAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICA8L21hdC1jYXJkPlxcbiAgICAgICAgPG1hdC1jYXJkPlxcbiAgICAgICAgICAgIDxtYXQtY2FyZC10aXRsZSBjbGFzcz1cXFwicGFkLWJvdHRvbS1zbVxcXCIgaWQ9XFxcIk1lbnVzXFxcIj5NZW51cyAoZHJvcGRvd25zKSA8bWF0LWljb24gY2xhc3M9XFxcImxpbmstdG8tY29tcG9uZW50XFxcIiByb3V0ZXJMaW5rPVxcXCIvXFxcIiBmcmFnbWVudD1cXFwiTWVudXNcXFwiPmxpbms8L21hdC1pY29uPjwvbWF0LWNhcmQtdGl0bGU+XFxuICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XFxcIm1lbnVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPm1vcmVfdmVydDwvbWF0LWljb24+XFxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICA8bWF0LW1lbnUgI21lbnU9XFxcIm1hdE1lbnVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtPiBSZWZyZXNoIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtPiBTZXR0aW5ncyA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbT4gSGVscCA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSBkaXNhYmxlZD4gU2lnbiBPdXQgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgIDwvbWF0LW1lbnU+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gY29sb3I9XFxcImZkcy1yZWd1bGFyXFxcIiBtYXQtcmFpc2VkLWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVxcXCJhYm92ZU1lbnVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgQWJvdmU8aSBjbGFzcz1cXFwiZmEgZmEtY2FyZXQtZG93blxcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiPjwvaT5cXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgIDxtYXQtbWVudSB5UG9zaXRpb249XFxcImFib3ZlXFxcIiAjYWJvdmVNZW51PVxcXCJtYXRNZW51XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbT4gUmVmcmVzaCA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbT4gU2V0dGluZ3MgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0+IEhlbHAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gZGlzYWJsZWQ+IFNpZ24gT3V0IDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICA8L21hdC1tZW51PlxcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNvbG9yPVxcXCJmZHMtcmVndWxhclxcXCIgbWF0LXJhaXNlZC1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cXFwiaWNvbnNNZW51XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIEljb25zIGluIE1lbnU8aSBjbGFzcz1cXFwiZmEgZmEtY2FyZXQtZG93blxcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiPjwvaT5cXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgIDxtYXQtbWVudSAjaWNvbnNNZW51PVxcXCJtYXRNZW51XFxcIiBbb3ZlcmxhcFRyaWdnZXJdPVxcXCJmYWxzZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmRpYWxwYWQ8L21hdC1pY29uPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlJlZGlhbDwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIGRpc2FibGVkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj52b2ljZW1haWw8L21hdC1pY29uPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPkNoZWNrIHZvaWNlbWFpbDwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5ub3RpZmljYXRpb25zX29mZjwvbWF0LWljb24+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+RGlzYWJsZSBhbGVydHM8L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPC9tYXQtbWVudT5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjb2xvcj1cXFwiZmRzLXByaW1hcnlcXFwiIFttYXRNZW51VHJpZ2dlckZvcl09XFxcInByaW1hcnlCdXR0b25Ecm9wZG93bk1lbnVcXFwiIG1hdC1yYWlzZWQtYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgRkRTIFByaW1hcnk8aSBjbGFzcz1cXFwiZmEgZmEtY2FyZXQtZG93blxcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiPjwvaT5cXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgIDxtYXQtbWVudSBjbGFzcz1cXFwiZmRzLXByaW1hcnktZHJvcGRvd24tYnV0dG9uLW1lbnVcXFwiICNwcmltYXJ5QnV0dG9uRHJvcGRvd25NZW51PVxcXCJtYXRNZW51XFxcIiBbb3ZlcmxhcFRyaWdnZXJdPVxcXCJmYWxzZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+T3B0aW9uIDE8L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSBkaXNhYmxlZD5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5PcHRpb24gMjwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICA8L21hdC1tZW51PlxcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNvbG9yPVxcXCJmZHMtcmVndWxhclxcXCIgbWF0LXJhaXNlZC1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cXFwicG9zWE1lbnVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgQmVmb3JlPGkgY2xhc3M9XFxcImZhIGZhLWNhcmV0LWRvd25cXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIj48L2k+XFxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICA8bWF0LW1lbnUgeFBvc2l0aW9uPVxcXCJiZWZvcmVcXFwiICNwb3NYTWVudT1cXFwibWF0TWVudVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0+IFJlZnJlc2ggPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0+IFNldHRpbmdzIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtPiBIZWxwIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIGRpc2FibGVkPiBTaWduIE91dCA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPC9tYXQtbWVudT5cXG4gICAgICAgICAgICAgICAgPGgzIGNsYXNzPVxcXCJtZC10aXRsZVxcXCI+VXNhZ2U8L2gzPlxcbiAgICAgICAgICAgICAgICA8cD5IVE1MOjwvcD5cXG4gICAgICAgICAgICAgICAgPHByZSBsYW5nPVxcXCJodG1sXFxcIj5cXG4gICAgICA8IVtDREFUQVtcXG4gICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XFxcIm1lbnVcXFwiPlxcbiAgICAgICAgICAgIDxtYXQtaWNvbj5tb3JlX3ZlcnQ8L21hdC1pY29uPlxcbiAgICAgICAgPC9idXR0b24+XFxuICAgICAgICA8bWF0LW1lbnUgI21lbnU9XFxcIm1hdE1lbnVcXFwiPlxcbiAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbT4gUmVmcmVzaCA8L2J1dHRvbj5cXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0+IFNldHRpbmdzIDwvYnV0dG9uPlxcbiAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbT4gSGVscCA8L2J1dHRvbj5cXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gZGlzYWJsZWQ+IFNpZ24gT3V0IDwvYnV0dG9uPlxcbiAgICAgICAgPC9tYXQtbWVudT5cXG4gICAgICAgIDxidXR0b24gY29sb3I9XFxcImZkcy1yZWd1bGFyXFxcIiBtYXQtcmFpc2VkLWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVxcXCJhYm92ZU1lbnVcXFwiPlxcbiAgICAgICAgICAgIEFib3ZlPGkgY2xhc3M9XFxcImZhIGZhLWNhcmV0LWRvd25cXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIj48L2k+XFxuICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgIDxtYXQtbWVudSB5UG9zaXRpb249XFxcImFib3ZlXFxcIiAjYWJvdmVNZW51PVxcXCJtYXRNZW51XFxcIj5cXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0+IFJlZnJlc2ggPC9idXR0b24+XFxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtPiBTZXR0aW5ncyA8L2J1dHRvbj5cXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0+IEhlbHAgPC9idXR0b24+XFxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIGRpc2FibGVkPiBTaWduIE91dCA8L2J1dHRvbj5cXG4gICAgICAgIDwvbWF0LW1lbnU+XFxuICAgICAgICA8YnV0dG9uIGNvbG9yPVxcXCJmZHMtcmVndWxhclxcXCIgbWF0LXJhaXNlZC1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cXFwiaWNvbnNNZW51XFxcIj5cXG4gICAgICAgICAgICBJY29ucyBpbiBNZW51PGkgY2xhc3M9XFxcImZhIGZhLWNhcmV0LWRvd25cXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIj48L2k+XFxuICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgIDxtYXQtbWVudSAjaWNvbnNNZW51PVxcXCJtYXRNZW51XFxcIiBbb3ZlcmxhcFRyaWdnZXJdPVxcXCJmYWxzZVxcXCI+XFxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtPlxcbiAgICAgICAgICAgICAgICA8bWF0LWljb24+ZGlhbHBhZDwvbWF0LWljb24+XFxuICAgICAgICAgICAgICAgIDxzcGFuPlJlZGlhbDwvc3Bhbj5cXG4gICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gZGlzYWJsZWQ+XFxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj52b2ljZW1haWw8L21hdC1pY29uPlxcbiAgICAgICAgICAgICAgICA8c3Bhbj5DaGVjayB2b2ljZW1haWw8L3NwYW4+XFxuICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtPlxcbiAgICAgICAgICAgICAgICA8bWF0LWljb24+bm90aWZpY2F0aW9uc19vZmY8L21hdC1pY29uPlxcbiAgICAgICAgICAgICAgICA8c3Bhbj5EaXNhYmxlIGFsZXJ0czwvc3Bhbj5cXG4gICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgIDwvbWF0LW1lbnU+XFxuICAgICAgICA8YnV0dG9uIGNvbG9yPVxcXCJmZHMtcHJpbWFyeVxcXCIgW21hdE1lbnVUcmlnZ2VyRm9yXT1cXFwicHJpbWFyeUJ1dHRvbkRyb3Bkb3duTWVudVxcXCIgbWF0LXJhaXNlZC1idXR0b24+XFxuICAgICAgICAgICAgRkRTIFByaW1hcnk8aSBjbGFzcz1cXFwiZmEgZmEtY2FyZXQtZG93blxcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiPjwvaT5cXG4gICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgPG1hdC1tZW51IGNsYXNzPVxcXCJmZHMtcHJpbWFyeS1kcm9wZG93bi1idXR0b24tbWVudVxcXCIgI3ByaW1hcnlCdXR0b25Ecm9wZG93bk1lbnU9XFxcIm1hdE1lbnVcXFwiIFtvdmVybGFwVHJpZ2dlcl09XFxcImZhbHNlXFxcIj5cXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0+XFxuICAgICAgICAgICAgICAgIDxzcGFuPk9wdGlvbiAxPC9zcGFuPlxcbiAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSBkaXNhYmxlZD5cXG4gICAgICAgICAgICAgICAgPHNwYW4+T3B0aW9uIDI8L3NwYW4+XFxuICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICA8L21hdC1tZW51PlxcbiAgICAgICAgPGJ1dHRvbiBjb2xvcj1cXFwiZmRzLXJlZ3VsYXJcXFwiIG1hdC1yYWlzZWQtYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XFxcInBvc1hNZW51XFxcIj5cXG4gICAgICAgICAgICBCZWZvcmU8aSBjbGFzcz1cXFwiZmEgZmEtY2FyZXQtZG93blxcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiPjwvaT5cXG4gICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgPG1hdC1tZW51IHhQb3NpdGlvbj1cXFwiYmVmb3JlXFxcIiAjcG9zWE1lbnU9XFxcIm1hdE1lbnVcXFwiPlxcbiAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbT4gUmVmcmVzaCA8L2J1dHRvbj5cXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0+IFNldHRpbmdzIDwvYnV0dG9uPlxcbiAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbT4gSGVscCA8L2J1dHRvbj5cXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gZGlzYWJsZWQ+IFNpZ24gT3V0IDwvYnV0dG9uPlxcbiAgICAgICAgPC9tYXQtbWVudT5cXG4gICAgICAgIF1dPlxcbiAgICAgIDwvcHJlPlxcbiAgICAgICAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cXG4gICAgICAgIDwvbWF0LWNhcmQ+XFxuICAgICAgICA8bWF0LWNhcmQ+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLXRpdGxlIGNsYXNzPVxcXCJwYWQtYm90dG9tLXNtXFxcIiBpZD1cXFwiRGlhbG9nXFxcIj5EaWFsb2cgPG1hdC1pY29uIGNsYXNzPVxcXCJsaW5rLXRvLWNvbXBvbmVudFxcXCIgcm91dGVyTGluaz1cXFwiL1xcXCIgZnJhZ21lbnQ9XFxcIkRpYWxvZ1xcXCI+bGluazwvbWF0LWljb24+PC9tYXQtY2FyZC10aXRsZT5cXG4gICAgICAgICAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cXG4gICAgICAgICAgICA8bWF0LWNhcmQtY29udGVudD5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cXFwiZmRzLXByaW1hcnlcXFwiIChjbGljayk9XFxcIm9wZW5EaWFsb2coKVxcXCI+U2hvdyBzaW1wbGUgZGlhbG9nPC9idXR0b24+XFxuICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cXFwibWQtdGl0bGVcXFwiPlVzYWdlPC9oMz5cXG4gICAgICAgICAgICAgICAgPHA+SFRNTDo8L3A+XFxuICAgICAgICAgICAgICAgIDxwcmUgbGFuZz1cXFwiaHRtbFxcXCI+XFxuICAgICAgPCFbQ0RBVEFbXFxuICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVxcXCJmZHMtcHJpbWFyeVxcXCIgKGNsaWNrKT1cXFwib3BlbkRpYWxvZygpXFxcIj5TaG93IHNpbXBsZSBkaWFsb2c8L2J1dHRvbj5cXG4gICAgICBdXT5cXG4gICAgPC9wcmU+XFxuICAgICAgICAgICAgICAgIDxwPkphdmFzY3JpcHQ6PC9wPlxcbiAgICAgICAgICAgICAgICA8cHJlIGxhbmc9XFxcImphdmFzY3JpcHRcXFwiPlxcbiAgICAgIDwhW0NEQVRBW1xcbiAgICAgICAgdmFyIG5nQ29yZSA9IHJlcXVpcmUoJ0Bhbmd1bGFyL2NvcmUnKTtcXG4gICAgICAgIGZ1bmN0aW9uIERpYWxvZ0NvbXBvbmVudCgpIHt9O1xcblxcbiAgICAgICAgRGlhbG9nQ29tcG9uZW50LnByb3RvdHlwZSA9IHtcXG4gICAgICAgICAgICBjb25zdHJ1Y3RvcjogRGlhbG9nQ29tcG9uZW50XFxuICAgICAgICB9O1xcblxcbiAgICAgICAgRGlhbG9nQ29tcG9uZW50LmFubm90YXRpb25zID0gW1xcbiAgICAgICAgICAgIG5ldyBuZ0NvcmUuQ29tcG9uZW50KHtcXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6ICdIZWxsbyBEaWFsb2cnXFxuICAgICAgICB9KV07XFxuXFxuICAgICAgICAuLi5cXG5cXG4gICAgICAgIGNvbnN0cnVjdG9yKE1hdERpYWxvZykge1xcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nID0gTWF0RGlhbG9nO1xcbiAgICAgICAgfVxcblxcbiAgICAgICAgLi4uXFxuXFxuICAgICAgICBvcGVuRGlhbG9nOiBmdW5jdGlvbigpIHtcXG4gICAgICAgICAgICB0aGlzLmRpYWxvZy5vcGVuKERpYWxvZ0NvbXBvbmVudCwge1xcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAnNTAlJywgLy8gY2FuIGJlIHB4IG9yICVcXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiAnNjAlJywgLy8gY2FuIGJlIHB4IG9yICVcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICk7XFxuICAgICAgICB9XFxuXFxuICAgICAgICAuLi5cXG5cXG4gICAgICAgIF1dPlxcbiAgICAgIDwvcHJlPlxcbiAgICAgICAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cXG4gICAgICAgIDwvbWF0LWNhcmQ+XFxuICAgICAgICA8bWF0LWNhcmQ+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLXRpdGxlIGNsYXNzPVxcXCJwYWQtYm90dG9tLXNtXFxcIiBpZD1cXFwiU2ltcGxlRGlhbG9nc1xcXCI+U2ltcGxlIERpYWxvZ3MgPG1hdC1pY29uIGNsYXNzPVxcXCJsaW5rLXRvLWNvbXBvbmVudFxcXCIgcm91dGVyTGluaz1cXFwiL1xcXCIgZnJhZ21lbnQ9XFxcIlNpbXBsZURpYWxvZ3NcXFwiPmxpbms8L21hdC1pY29uPjwvbWF0LWNhcmQtdGl0bGU+XFxuICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhZC1sZWZ0LXNtXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XFxcImZkcy1wcmltYXJ5XFxcIiAoY2xpY2spPVxcXCJvcGVuQ29uZmlybSgpXFxcIiBjbGFzcz1cXFwidGV4dC11cHBlclxcXCI+T3BlblxcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpcm1cXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgPGgzIGNsYXNzPVxcXCJtZC10aXRsZVxcXCI+VXNhZ2U8L2gzPlxcbiAgICAgICAgICAgICAgICA8cD5IVE1MOjwvcD5cXG4gICAgICAgICAgICAgICAgPHByZSBsYW5nPVxcXCJodG1sXFxcIj5cXG4gICAgICA8IVtDREFUQVtcXG4gICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBjb2xvcj1cXFwicHJpbWFyeVxcXCIgKGNsaWNrKT1cXFwib3BlbkNvbmZpcm0oKVxcXCIgY2xhc3M9XFxcInRleHQtdXBwZXJcXFwiPk9wZW4gQ29uZmlybTwvYnV0dG9uPlxcbiAgICAgICAgXV0+XFxuICAgICAgPC9wcmU+XFxuICAgICAgICAgICAgICAgIDxwPkphdmFzY3JpcHQ6PC9wPlxcbiAgICAgICAgICAgICAgICA8cHJlIGxhbmc9XFxcImphdmFzY3JpcHRcXFwiPlxcbiAgICAgIDwhW0NEQVRBW1xcbiAgICAgICAgLi4uXFxuXFxuICAgICAgICBjb25zdHJ1Y3RvcihUZERpYWxvZ1NlcnZpY2UpIHtcXG4gICAgICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UgPSBUZERpYWxvZ1NlcnZpY2VcXG4gICAgICAgIH1cXG5cXG4gICAgICAgIC4uLlxcblxcbiAgICAgICAgb3BlbkNvbmZpcm06IGZ1bmN0aW9uKCkge1xcbiAgICAgICAgICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlbkNvbmZpcm0oe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogJ0NvbmZpcm0nLFxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnVGhpcyBpcyBob3cgc2ltcGxlIGl0IGlzIHRvIGNyZWF0ZSBhIGNvbmZpcm0gd2l0aCB0aGlzIHdyYXBwZXIgc2VydmljZS4gRG8geW91IGFncmVlPycsXFxuICAgICAgICAgICAgICAgIGNhbmNlbEJ1dHRvbjogJ0Rpc2FncmVlJyxcXG4gICAgICAgICAgICAgICAgYWNjZXB0QnV0dG9uOiAnQWdyZWUnLFxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIC4uLlxcbiAgICAgICAgXV0+XFxuICAgICAgPC9wcmU+XFxuICAgICAgICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxcbiAgICAgICAgPC9tYXQtY2FyZD5cXG4gICAgICAgIDxtYXQtY2FyZD5cXG4gICAgICAgICAgICA8bWF0LWNhcmQtdGl0bGUgY2xhc3M9XFxcInBhZC1ib3R0b20tc21cXFwiIGlkPVxcXCJTbmFja0JhcnNcXFwiPlNuYWNrIEJhcnMgPG1hdC1pY29uIGNsYXNzPVxcXCJsaW5rLXRvLWNvbXBvbmVudFxcXCIgcm91dGVyTGluaz1cXFwiL1xcXCIgZnJhZ21lbnQ9XFxcIlNuYWNrQmFyc1xcXCI+bGluazwvbWF0LWljb24+PC9tYXQtY2FyZC10aXRsZT5cXG4gICAgICAgICAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cXG4gICAgICAgICAgICA8bWF0LWNhcmQtY29udGVudD5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cXFwiZmRzLXByaW1hcnlcXFwiIChjbGljayk9XFxcInNob3dTdWNjZXNzU25hY2tCYXIoKVxcXCI+U3VjY2VzcyBTbmFjayBCYXI8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cXFwiZmRzLXByaW1hcnlcXFwiIChjbGljayk9XFxcInNob3dXYXJuU25hY2tCYXIoKVxcXCI+V2FybmluZyBTbmFjayBCYXI8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cXFwiZmRzLXByaW1hcnlcXFwiIChjbGljayk9XFxcInNob3dFcnJvclNuYWNrQmFyKClcXFwiPkVycm9yIFNuYWNrIEJhcjwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVxcXCJmZHMtcHJpbWFyeVxcXCIgKGNsaWNrKT1cXFwic2hvd1JlZ3VsYXJTbmFja0JhcigpXFxcIj5SZWd1bGFyIFNuYWNrIEJhcjwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XFxcIm1kLXRpdGxlXFxcIj5Vc2FnZTwvaDM+XFxuICAgICAgICAgICAgICAgIDxwPkhUTUw6PC9wPlxcbiAgICAgICAgICAgICAgICA8cHJlIGxhbmc9XFxcImh0bWxcXFwiPlxcbiAgICAgIDwhW0NEQVRBW1xcbiAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cXFwiZmRzLXByaW1hcnlcXFwiIChjbGljayk9XFxcInNob3dTdWNjZXNzU25hY2tCYXIoKVxcXCI+U3VjY2VzcyBTbmFjayBCYXI8L2J1dHRvbj5cXG4gICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XFxcImZkcy1wcmltYXJ5XFxcIiAoY2xpY2spPVxcXCJzaG93V2FyblNuYWNrQmFyKClcXFwiPldhcm5pbmcgU25hY2sgQmFyPC9idXR0b24+XFxuICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVxcXCJmZHMtcHJpbWFyeVxcXCIgKGNsaWNrKT1cXFwic2hvd0Vycm9yU25hY2tCYXIoKVxcXCI+RXJyb3IgU25hY2sgQmFyPC9idXR0b24+XFxuICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVxcXCJmZHMtcHJpbWFyeVxcXCIgKGNsaWNrKT1cXFwic2hvd1JlZ3VsYXJTbmFja0JhcigpXFxcIj5SZWd1bGFyIFNuYWNrIEJhcjwvYnV0dG9uPlxcbiAgICAgIF1dPlxcbiAgICA8L3ByZT5cXG4gICAgICAgICAgICAgICAgPHA+SmF2YXNjcmlwdDo8L3A+XFxuICAgICAgICAgICAgICAgIDxwcmUgbGFuZz1cXFwiamF2YXNjcmlwdFxcXCI+XFxuICAgICAgPCFbQ0RBVEFbXFxuICAgICAgICAuLi5cXG5cXG4gICAgICAgIGNvbnN0cnVjdG9yKEZkc1NuYWNrQmFyU2VydmljZSkge1xcbiAgICAgICAgICAgIHRoaXMuc25hY2tCYXJTZXJ2aWNlID0gRmRzU25hY2tCYXJTZXJ2aWNlO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIC4uLlxcblxcbiAgICAgICAgLyoqIFBvc3NpYmxlIHZhbHVlcyBmb3IgaG9yaXpvbnRhbFBvc2l0aW9uIG9uIE1hdFNuYWNrQmFyQ29uZmlnIGFyZSAnc3RhcnQnIHwgJ2NlbnRlcicgfCAnZW5kJyB8ICdsZWZ0JyB8ICdyaWdodCcuICovXFxuICAgICAgICAvKiogUG9zc2libGUgdmFsdWVzIGZvciB2ZXJ0aWNhbFBvc2l0aW9uIG9uIE1hdFNuYWNrQmFyQ29uZmlnIGFyZSAndG9wJyB8ICdib3R0b20nLiAqL1xcbiAgICAgICAgLyoqIFBvc3NpYmxlIHZhbHVlcyBmb3IgaWNvbiBvbiBNYXRTbmFja0JhckNvbmZpZyBhcmUgYW55IGF2YWlsYWJsZSBpY29ucyBsb2FkZWQgb24gdGhlIHBhZ2UuICovXFxuXFxuICAgICAgICBzaG93U3VjY2Vzc1NuYWNrQmFyOiBmdW5jdGlvbiAoKSB7XFxuICAgICAgICAgICAgICAgIHZhciBzbmFja0JhclJlZiA9IHRoaXMuc25hY2tCYXJTZXJ2aWNlLm9wZW5Db2FzdGVyKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6ICdTdWNjZXNzJyxcXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ1NvbWUgaGVscCB0ZXh0IHJlZ2FyZGluZyB0aGUgc3VjY2Vzc2Z1bCBldmVudC4nLFxcbiAgICAgICAgICAgICAgICB2ZXJ0aWNhbFBvc2l0aW9uOiAndG9wJyxcXG4gICAgICAgICAgICAgICAgaG9yaXpvbnRhbFBvc2l0aW9uOiAncmlnaHQnLFxcbiAgICAgICAgICAgICAgICBpY29uOiAnZmEgZmEtY2hlY2stY2lyY2xlLW8nLFxcbiAgICAgICAgICAgICAgICBjb2xvcjogJyMxRUI0NzUnLFxcbiAgICAgICAgICAgICAgICBkdXJhdGlvbjogMzAwMFxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIHNob3dXYXJuU25hY2tCYXI6IGZ1bmN0aW9uICgpIHtcXG4gICAgICAgICAgICAgICAgdmFyIHNuYWNrQmFyUmVmID0gdGhpcy5zbmFja0JhclNlcnZpY2Uub3BlbkNvYXN0ZXIoe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogJ1dhcm5pbmcnLFxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnU29tZSBoZWxwIHRleHQgcmVnYXJkaW5nIHRoZSB3YXJuaW5nLicsXFxuICAgICAgICAgICAgICAgIHZlcnRpY2FsUG9zaXRpb246ICd0b3AnLFxcbiAgICAgICAgICAgICAgICBob3Jpem9udGFsUG9zaXRpb246ICdsZWZ0JyxcXG4gICAgICAgICAgICAgICAgaWNvbjogJ2ZhIGZhLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlJyxcXG4gICAgICAgICAgICAgICAgY29sb3I6ICcjRTk4QTQwJyxcXG4gICAgICAgICAgICAgICAgZHVyYXRpb246IDMwMDBcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBzaG93RXJyb3JTbmFja0JhcjogZnVuY3Rpb24gKCkge1xcbiAgICAgICAgICAgICAgICB2YXIgc25hY2tCYXJSZWYgPSB0aGlzLnNuYWNrQmFyU2VydmljZS5vcGVuQ29hc3Rlcih7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiAnRXJyb3InLFxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnU29tZSBoZWxwIHRleHQgcmVnYXJkaW5nIHRoZSBjcml0aWNhbCBlcnJvci4gVGhpcyBjb2FzdGVyIHdpbGwgc3RheSBvcGVuIHVudGlsIGNsb3NlZCB3aXRoIHRoZSBgeGAgb3IgaWYgYW5vdGhlciBjb2FzdGVyIGlzIGNyZWF0ZWQuJyxcXG4gICAgICAgICAgICAgICAgdmVydGljYWxQb3NpdGlvbjogJ2JvdHRvbScsXFxuICAgICAgICAgICAgICAgIGhvcml6b250YWxQb3NpdGlvbjogJ3JpZ2h0JyxcXG4gICAgICAgICAgICAgICAgaWNvbjogJ2ZhIGZhLXRpbWVzLWNpcmNsZS1vJyxcXG4gICAgICAgICAgICAgICAgY29sb3I6ICcjRUY2MTYyJ1xcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIHNob3dSZWd1bGFyU25hY2tCYXI6IGZ1bmN0aW9uICgpIHtcXG4gICAgICAgICAgICAgICAgdmFyIHNuYWNrQmFyUmVmID0gdGhpcy5zbmFja0JhclNlcnZpY2Uub3BlbkNvYXN0ZXIoe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogJ1JlZ3VsYXInLFxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnU29tZXRoaW5nIGludGVyZXN0aW5nLicsXFxuICAgICAgICAgICAgICAgIHZlcnRpY2FsUG9zaXRpb246ICdib3R0b20nLFxcbiAgICAgICAgICAgICAgICBob3Jpem9udGFsUG9zaXRpb246ICdsZWZ0JyxcXG4gICAgICAgICAgICAgICAgY29sb3I6ICcjODA4NzkzJyxcXG4gICAgICAgICAgICAgICAgZHVyYXRpb246IDMwMDBcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICAuLi5cXG4gICAgICAgIF1dPlxcbiAgICAgIDwvcHJlPlxcbiAgICAgICAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cXG4gICAgICAgIDwvbWF0LWNhcmQ+XFxuICAgICAgICA8bWF0LWNhcmQ+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLXRpdGxlIGNsYXNzPVxcXCJwYWQtYm90dG9tLXNtXFxcIiBpZD1cXFwiRXhwYW5zaW9uUGFuZWxzXFxcIj5FeHBhbnNpb24gUGFuZWxzIDxtYXQtaWNvbiBjbGFzcz1cXFwibGluay10by1jb21wb25lbnRcXFwiIHJvdXRlckxpbms9XFxcIi9cXFwiIGZyYWdtZW50PVxcXCJFeHBhbnNpb25QYW5lbHNcXFwiPmxpbms8L21hdC1pY29uPjwvbWF0LWNhcmQtdGl0bGU+XFxuICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICAgICAgICAgIDxwPkV4cGFuZC9Db2xsYXBzZSBFdmVudCBmb3IgRXhwYW5zaW9uIDE6IHt7ZXhwYW5kQ29sbGFwc2VFeHBhbnNpb24xTXNnfX08L3A+XFxuICAgICAgICAgICAgICAgIDxkaXY+XFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gY29sb3I9XFxcInByaW1hcnlcXFwiIChjbGljayk9XFxcInRvZ2dsZURpc2FibGVkKClcXFwiIGNsYXNzPVxcXCJ0ZXh0LXVwcGVyXFxcIj5Ub2dnbGUgZGlzYWJsZVxcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gY29sb3I9XFxcInByaW1hcnlcXFwiIChjbGljayk9XFxcInRvZ2dsZUV4cGFuc2lvbjEoKVxcXCIgY2xhc3M9XFxcInRleHQtdXBwZXJcXFwiPlRvZ2dsZSBmaXJzdFxcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICA8ZGl2IGxheW91dC1ndC14cz1cXFwicm93XFxcIiBsYXlvdXQtYWxpZ24tZ3QteHM9XFxcImNlbnRlciBzdGFydFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGZsZXgtZ3QteHM9XFxcIjkwXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQtZXhwYW5zaW9uLXBhbmVsIGxhYmVsPVxcXCJHb29nbGVcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJsYWJlbD1cXFwiMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwgTW91bnRhaW4gVmlldywgQ0EgOTQwNDMsIFVTQVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtleHBhbmRdPVxcXCJleHBhbnNpb24xXFxcIiBbZGlzYWJsZWRdPVxcXCJkaXNhYmxlZFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChleHBhbmRlZCk9XFxcImV4cGFuZEV4cGFuc2lvbjFFdmVudCgpXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbGxhcHNlZCk9XFxcImNvbGxhcHNlRXhwYW5zaW9uMUV2ZW50KClcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQtZXhwYW5zaW9uLXN1bW1hcnk+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxpc3Q+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1saXN0LWl0ZW0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBtYXQtbGlzdC1hdmF0YXI+cGluX2Ryb3A8L21hdC1pY29uPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgbWF0LWxpbmU+R29vZ2xlPC9oMz5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IG1hdC1saW5lPkhlYWRxdWFydGVyczwvaDQ+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIG1hdC1saW5lPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyLz5Nb3VudGFpbiBWaWV3LCBDQSA5NDA0MywgVVNBXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1saXN0LWl0ZW0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1saXN0PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkLWV4cGFuc2lvbi1zdW1tYXJ5PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtYXQtcGFkZGluZ1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBjbGFzcz1cXFwibWF0LXBhZGRpbmdcXFwiIGxheW91dD1cXFwiY29sdW1uXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgZmxvYXRMYWJlbD1cXFwiYWx3YXlzXFxcIiBmbGV4PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XFxcIkNvbXBhbnkgKGRpc2FibGVkKVxcXCIgZGlzYWJsZWQgdmFsdWU9XFxcIkdvb2dsZVxcXCIvPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGZsb2F0TGFiZWw9XFxcImFsd2F5c1xcXCIgZmxleD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG1hdElucHV0IHBsYWNlaG9sZGVyPVxcXCJEZXNjcmlwdGlvblxcXCIgcm93cz1cXFwiNFxcXCI+PC90ZXh0YXJlYT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBsYXlvdXQ9XFxcInJvd1xcXCIgbGF5b3V0LW1hcmdpbiBsYXlvdXQtYWxpZ249XFxcImVuZCBjZW50ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBjbGFzcz1cXFwidGV4dC11cHBlclxcXCI+Q2FuY2VsPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNvbG9yPVxcXCJhY2NlbnRcXFwiIGNsYXNzPVxcXCJ0ZXh0LXVwcGVyXFxcIj5TYXZlPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZC1leHBhbnNpb24tcGFuZWw+XFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cXFwibWQtdGl0bGVcXFwiPlVzYWdlPC9oMz5cXG4gICAgICAgICAgICAgICAgPHA+SFRNTDo8L3A+XFxuICAgICAgICAgICAgICAgIDxwcmUgbGFuZz1cXFwiaHRtbFxcXCI+XFxuICAgICAgPCFbQ0RBVEFbXFxuICAgICAgICA8dGQtZXhwYW5zaW9uLXBhbmVsIGxhYmVsPVxcXCJHb29nbGVcXFwiIHN1YmxhYmVsPVxcXCIxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LCBNb3VudGFpbiBWaWV3LCBDQSA5NDA0MywgVVNBXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZXhwYW5kXT1cXFwiZXhwYW5zaW9uMVxcXCIgW2Rpc2FibGVkXT1cXFwiZGlzYWJsZWRcXFwiIChleHBhbmRlZCk9XFxcImV4cGFuZEV4cGFuc2lvbjFFdmVudCgpXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29sbGFwc2VkKT1cXFwiY29sbGFwc2VFeHBhbnNpb24xRXZlbnQoKVxcXCI+XFxuICAgICAgICAgICAgPHRkLWV4cGFuc2lvbi1zdW1tYXJ5PlxcbiAgICAgICAgICAgICAgICA8bWF0LWxpc3Q+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LWxpc3QtaXRlbT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gbWF0LWxpc3QtYXZhdGFyPnBpbl9kcm9wPC9tYXQtaWNvbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDMgbWF0LWxpbmU+R29vZ2xlPC9oMz5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDQgbWF0LWxpbmU+SGVhZHF1YXJ0ZXJzPC9oND5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBtYXQtbGluZT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIvPk1vdW50YWluIFZpZXcsIENBIDk0MDQzLCBVU0FcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3A+XFxuICAgICAgICAgICAgICAgICAgICA8L21hdC1saXN0LWl0ZW0+XFxuICAgICAgICAgICAgICAgIDwvbWF0LWxpc3Q+XFxuICAgICAgICAgICAgPC90ZC1leHBhbnNpb24tc3VtbWFyeT5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtYXQtcGFkZGluZ1xcXCI+XFxuICAgICAgICAgICAgICAgIDxmb3JtIGNsYXNzPVxcXCJtYXQtcGFkZGluZ1xcXCIgbGF5b3V0PVxcXCJjb2x1bW5cXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGZsb2F0TGFiZWw9XFxcImFsd2F5c1xcXCIgZmxleD5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XFxcIkNvbXBhbnkgKGRpc2FibGVkKVxcXCIgZGlzYWJsZWQgdmFsdWU9XFxcIkdvb2dsZVxcXCIvPlxcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBmbG9hdExhYmVsPVxcXCJhbHdheXNcXFwiIGZsZXg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG1hdElucHV0IHBsYWNlaG9sZGVyPVxcXCJEZXNjcmlwdGlvblxcXCIgcm93cz1cXFwiNFxcXCI+PC90ZXh0YXJlYT5cXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XFxuICAgICAgICAgICAgICAgIDwvZm9ybT5cXG4gICAgICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XFxuICAgICAgICAgICAgICAgIDxkaXYgbGF5b3V0PVxcXCJyb3dcXFwiIGxheW91dC1tYXJnaW4gbGF5b3V0LWFsaWduPVxcXCJlbmQgY2VudGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBjbGFzcz1cXFwidGV4dC11cHBlclxcXCI+Q2FuY2VsPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gY29sb3I9XFxcImFjY2VudFxcXCIgY2xhc3M9XFxcInRleHQtdXBwZXJcXFwiPlNhdmU8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L3RkLWV4cGFuc2lvbi1wYW5lbD5cXG4gICAgICAgIF1dPlxcbiAgICAgIDwvcHJlPlxcbiAgICAgICAgICAgICAgICA8cD5KYXZhc2NyaXB0OjwvcD5cXG4gICAgICAgICAgICAgICAgPHByZSBsYW5nPVxcXCJqYXZhc2NyaXB0XFxcIj5cXG4gICAgICAgICAgPCFbQ0RBVEFbXFxuICAgICAgICB0aGlzLmV4cGFuZENvbGxhcHNlRXhwYW5zaW9uMU1zZyA9ICdObyBleHBhbmRlZC9jb2xsYXBzZWQgZGV0ZWN0ZWQgeWV0JztcXG4gICAgICAgIHRoaXMuZXhwYW5zaW9uMSA9IGZhbHNlO1xcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGZhbHNlO1xcblxcbiAgICAgICAgLi4uXFxuXFxuICAgICAgICB0b2dnbGVFeHBhbnNpb24xOiBmdW5jdGlvbigpIHtcXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xcbiAgICAgICAgICAgICAgICB0aGlzLmV4cGFuc2lvbjEgPSAhdGhpcy5leHBhbnNpb24xO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0sXFxuXFxuICAgICAgICB0b2dnbGVEaXNhYmxlZDogZnVuY3Rpb24oKSB7XFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGVkID0gIXRoaXMuZGlzYWJsZWQ7XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgZXhwYW5kRXhwYW5zaW9uMUV2ZW50OiBmdW5jdGlvbigpIHtcXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwYW5kQ29sbGFwc2VFeHBhbnNpb24xTXNnID0gJ0V4cGFuZCBldmVudCBlbWl0dGVkLic7XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgY29sbGFwc2VFeHBhbnNpb24xRXZlbnQ6IGZ1bmN0aW9uKCkge1xcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBhbmRDb2xsYXBzZUV4cGFuc2lvbjFNc2cgPSAnQ29sbGFwc2UgZXZlbnQgZW1pdHRlZC4nO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIC4uLlxcbiAgICAgICAgICAgIF1dPlxcbiAgICAgICAgICA8L3ByZT5cXG4gICAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICA8L21hdC1jYXJkPlxcbiAgICAgICAgPG1hdC1jYXJkPlxcbiAgICAgICAgICAgIDxtYXQtY2FyZC10aXRsZSBjbGFzcz1cXFwicGFkLWJvdHRvbS1zbVxcXCIgaWQ9XFxcIlByb2dyZXNzXFxcIj5Qcm9ncmVzcyA8bWF0LWljb24gY2xhc3M9XFxcImxpbmstdG8tY29tcG9uZW50XFxcIiByb3V0ZXJMaW5rPVxcXCIvXFxcIiBmcmFnbWVudD1cXFwiUHJvZ3Jlc3NcXFwiPmxpbms8L21hdC1pY29uPjwvbWF0LWNhcmQtdGl0bGU+XFxuICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQgbGF5b3V0PVxcXCJyb3dcXFwiPlxcbiAgICAgICAgICAgICAgICA8ZGl2IGZsZXg9XFxcIjQ4XFxcIiBjbGFzcz1cXFwicGFkLXJpZ2h0XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cXFwibWQtdGl0bGVcXFwiPlByb2dyZXNzIEJhcnM8L2gzPlxcbiAgICAgICAgICAgICAgICAgICAgPGg0PkRldGVybWluYXRlPC9oND5cXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtcHJvZ3Jlc3MtYmFyIG1vZGU9XFxcImRldGVybWluYXRlXFxcIiB2YWx1ZT1cXFwiNDBcXFwiPjwvbWF0LXByb2dyZXNzLWJhcj5cXG4gICAgICAgICAgICAgICAgICAgIDxoND5JbmRldGVybWluYXRlPC9oND5cXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtcHJvZ3Jlc3MtYmFyIG1vZGU9XFxcImluZGV0ZXJtaW5hdGVcXFwiPjwvbWF0LXByb2dyZXNzLWJhcj5cXG4gICAgICAgICAgICAgICAgICAgIDxoND5CdWZmZXI8L2g0PlxcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1wcm9ncmVzcy1iYXIgbW9kZT1cXFwiYnVmZmVyXFxcIiB2YWx1ZT1cXFwiMTVcXFwiIGJ1ZmZlclZhbHVlPVxcXCIxNVxcXCI+PC9tYXQtcHJvZ3Jlc3MtYmFyPlxcbiAgICAgICAgICAgICAgICAgICAgPGg0PlF1ZXJ5PC9oND5cXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtcHJvZ3Jlc3MtYmFyIG1vZGU9XFxcInF1ZXJ5XFxcIj48L21hdC1wcm9ncmVzcy1iYXI+XFxuICAgICAgICAgICAgICAgICAgICA8aDQ+Q29sb3JzPC9oND5cXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtcHJvZ3Jlc3MtYmFyIG1vZGU9XFxcImluZGV0ZXJtaW5hdGVcXFwiIGNvbG9yPVxcXCJwcmltYXJ5XFxcIj48L21hdC1wcm9ncmVzcy1iYXI+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LXByb2dyZXNzLWJhciBtb2RlPVxcXCJpbmRldGVybWluYXRlXFxcIiBjb2xvcj1cXFwiYWNjZW50XFxcIj48L21hdC1wcm9ncmVzcy1iYXI+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LXByb2dyZXNzLWJhciBtb2RlPVxcXCJpbmRldGVybWluYXRlXFxcIiBjb2xvcj1cXFwid2FyblxcXCI+PC9tYXQtcHJvZ3Jlc3MtYmFyPlxcbiAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVxcXCJtZC10aXRsZVxcXCI+VXNhZ2U8L2gzPlxcbiAgICAgICAgICAgICAgICAgICAgPHA+SFRNTDo8L3A+XFxuICAgICAgICAgICAgICAgICAgICA8cHJlIGxhbmc9XFxcImh0bWxcXFwiPlxcbiAgICAgIDwhW0NEQVRBW1xcbiAgICAgICAgPCEtLSBEZXRlcm1pbmF0ZS0tPlxcbiAgICAgICAgPG1hdC1wcm9ncmVzcy1iYXIgbW9kZT1cXFwiZGV0ZXJtaW5hdGVcXFwiIHZhbHVlPVxcXCI0MFxcXCI+PC9tYXQtcHJvZ3Jlc3MtYmFyPlxcblxcbiAgICAgICAgPCEtLSBJbmRldGVybWluYXRlLS0+XFxuICAgICAgICA8bWF0LXByb2dyZXNzLWJhciBtb2RlPVxcXCJpbmRldGVybWluYXRlXFxcIj48L21hdC1wcm9ncmVzcy1iYXI+XFxuXFxuICAgICAgICA8IS0tIEJ1ZmZlci0tPlxcbiAgICAgICAgPG1hdC1wcm9ncmVzcy1iYXIgbW9kZT1cXFwiYnVmZmVyXFxcIiB2YWx1ZT1cXFwiMTVcXFwiIGJ1ZmZlclZhbHVlPVxcXCIxNVxcXCI+PC9tYXQtcHJvZ3Jlc3MtYmFyPlxcblxcbiAgICAgICAgPCEtLSBRdWVyeS0tPlxcbiAgICAgICAgPG1hdC1wcm9ncmVzcy1iYXIgbW9kZT1cXFwicXVlcnlcXFwiPjwvbWF0LXByb2dyZXNzLWJhcj5cXG5cXG4gICAgICAgIDwhLS0gQ29sb3JzLS0+XFxuICAgICAgICA8bWF0LXByb2dyZXNzLWJhciBtb2RlPVxcXCJpbmRldGVybWluYXRlXFxcIiBjb2xvcj1cXFwicHJpbWFyeVxcXCI+PC9tYXQtcHJvZ3Jlc3MtYmFyPlxcblxcbiAgICAgICAgPG1hdC1wcm9ncmVzcy1iYXIgbW9kZT1cXFwiaW5kZXRlcm1pbmF0ZVxcXCIgY29sb3I9XFxcImFjY2VudFxcXCI+PC9tYXQtcHJvZ3Jlc3MtYmFyPlxcblxcbiAgICAgICAgPG1hdC1wcm9ncmVzcy1iYXIgbW9kZT1cXFwiaW5kZXRlcm1pbmF0ZVxcXCIgY29sb3I9XFxcIndhcm5cXFwiPjwvbWF0LXByb2dyZXNzLWJhcj5cXG4gICAgICBdXT5cXG4gICAgICA8L3ByZT5cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgIDxkaXYgZmxleD1cXFwiNDhcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBQcm9ncmVzcyBjaXJjbGVzLS0+XFxuICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XFxcIm1kLXRpdGxlXFxcIj5Qcm9ncmVzcyBTcGlubmVyPC9oMz5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgbGF5b3V0PVxcXCJyb3dcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoND5EZXRlcm1pbmF0ZTwvaDQ+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtcHJvZ3Jlc3Mtc3Bpbm5lciBtb2RlPVxcXCJkZXRlcm1pbmF0ZVxcXCIgdmFsdWU9XFxcIjY2XFxcIj48L21hdC1wcm9ncmVzcy1zcGlubmVyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoND5pbmRldGVybWluYXRlPC9oND5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1wcm9ncmVzcy1zcGlubmVyIG1vZGU9XFxcImluZGV0ZXJtaW5hdGVcXFwiPjwvbWF0LXByb2dyZXNzLXNwaW5uZXI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0PlNwaW5uZXI8L2g0PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNwaW5uZXI+PC9tYXQtc3Bpbm5lcj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDQ+Q29sb3JzPC9oND5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGxheW91dD1cXFwicm93XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1wcm9ncmVzcy1zcGlubmVyIG1vZGU9XFxcImluZGV0ZXJtaW5hdGVcXFwiIGNvbG9yPVxcXCJwcmltYXJ5XFxcIj48L21hdC1wcm9ncmVzcy1zcGlubmVyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXByb2dyZXNzLXNwaW5uZXIgbW9kZT1cXFwiaW5kZXRlcm1pbmF0ZVxcXCIgY29sb3I9XFxcImFjY2VudFxcXCI+PC9tYXQtcHJvZ3Jlc3Mtc3Bpbm5lcj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1wcm9ncmVzcy1zcGlubmVyIG1vZGU9XFxcImluZGV0ZXJtaW5hdGVcXFwiIGNvbG9yPVxcXCJ3YXJuXFxcIj48L21hdC1wcm9ncmVzcy1zcGlubmVyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XFxcIm1kLXRpdGxlXFxcIj5Vc2FnZTwvaDM+XFxuICAgICAgICAgICAgICAgICAgICA8cD5IVE1MOjwvcD5cXG4gICAgICAgICAgICAgICAgICAgIDxwcmUgbGFuZz1cXFwiaHRtbFxcXCI+XFxuICAgICAgPCFbQ0RBVEFbXFxuICAgICAgICA8IS0tIERldGVybWluYXRlIC0tPlxcbiAgICAgICAgPG1hdC1wcm9ncmVzcy1zcGlubmVyIG1vZGU9XFxcImRldGVybWluYXRlXFxcIiB2YWx1ZT1cXFwiNjZcXFwiPjwvbWF0LXByb2dyZXNzLXNwaW5uZXI+XFxuICAgICAgICA8IS0tIEluZGV0ZXJtaW5hdGUgLS0+XFxuICAgICAgICA8bWF0LXByb2dyZXNzLXNwaW5uZXIgbW9kZT1cXFwiaW5kZXRlcm1pbmF0ZVxcXCI+PC9tYXQtcHJvZ3Jlc3Mtc3Bpbm5lcj5cXG4gICAgICAgIDwhLS0gU3Bpbm5lciAtLT5cXG4gICAgICAgIDxtYXQtc3Bpbm5lcj48L21hdC1zcGlubmVyPlxcbiAgICAgICAgPCEtLSBDb2xvcnMgLS0+XFxuICAgICAgICA8bWF0LXByb2dyZXNzLXNwaW5uZXIgbW9kZT1cXFwiaW5kZXRlcm1pbmF0ZVxcXCIgY29sb3I9XFxcInByaW1hcnlcXFwiPjwvbWF0LXByb2dyZXNzLXNwaW5uZXI+XFxuICAgICAgICA8bWF0LXByb2dyZXNzLXNwaW5uZXIgbW9kZT1cXFwiaW5kZXRlcm1pbmF0ZVxcXCIgY29sb3I9XFxcImFjY2VudFxcXCI+PC9tYXQtcHJvZ3Jlc3Mtc3Bpbm5lcj5cXG4gICAgICAgIDxtYXQtcHJvZ3Jlc3Mtc3Bpbm5lciBtb2RlPVxcXCJpbmRldGVybWluYXRlXFxcIiBjb2xvcj1cXFwid2FyblxcXCI+PC9tYXQtcHJvZ3Jlc3Mtc3Bpbm5lcj5cXG4gICAgICBdXT5cXG4gICAgICA8L3ByZT5cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxcbiAgICAgICAgPC9tYXQtY2FyZD5cXG4gICAgICAgIDxtYXQtY2FyZD5cXG4gICAgICAgICAgICA8bWF0LWNhcmQtdGl0bGUgY2xhc3M9XFxcInBhZC1ib3R0b20tc21cXFwiIGlkPVxcXCJTaWRlTmF2XFxcIj5TaWRlIE5hdiA8bWF0LWljb24gY2xhc3M9XFxcImxpbmstdG8tY29tcG9uZW50XFxcIiByb3V0ZXJMaW5rPVxcXCIvXFxcIiBmcmFnbWVudD1cXFwiU2lkZU5hdlxcXCI+bGluazwvbWF0LWljb24+PC9tYXQtY2FyZC10aXRsZT5cXG4gICAgICAgICAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cXG4gICAgICAgICAgICA8bWF0LWNhcmQtY29udGVudD5cXG4gICAgICAgICAgICAgICAgPHA+VGhlIHNpZGUgbmF2IGNhbiBiZSBvcGVuZWQgYXQgdGhlIGBzdGFydGAgb3IgYGVuZGAgb2YgYSBjb250YWluZXIgYW5kIGNhbiBiZSBkaXNwbGF5ZWQgaW4gYG92ZXJgLFxcbiAgICAgICAgICAgICAgICAgICAgYHNpZGVgLCBvciBgcHVzaGAgbW9kZS4gWW91IGNhbiBhbHNvIGRlZmluZSBpdHMgd2lkdGguPC9wPlxcbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdFRvb2x0aXA9XFxcIk9wZW4gc2lkZSBuYXZcXFwiIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVxcXCJmZHMtcHJpbWFyeVxcXCIgKGNsaWNrKT1cXFwic2lkZW5hdi50b2dnbGUoKVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICBPcGVuXFxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XFxcIm1kLXRpdGxlXFxcIj5Vc2FnZTwvaDM+XFxuICAgICAgICAgICAgICAgIDxwPkhUTUw6PC9wPlxcbiAgICAgICAgICAgICAgICA8cHJlIGxhbmc9XFxcImh0bWxcXFwiPlxcbiAgICAgICAgPCFbQ0RBVEFbXFxuICAgICAgICA8IS0tIEJhc2ljIFVzYWdlIC0tPlxcbiAgICAgICAgPG1hdC1zaWRlbmF2ICNzaWRlbmF2IG1vZGU9XFxcIm92ZXJcXFwiIGFsaWduPVxcXCJlbmRcXFwiIG9wZW5lZD1cXFwiZmFsc2VcXFwiPlxcbiAgICAgICAgICAgIC4uLlxcbiAgICAgICAgPC9tYXQtc2lkZW5hdj5cXG4gICAgICAgIF1dPlxcbiAgICAgICAgPC9wcmU+XFxuICAgICAgICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxcbiAgICAgICAgPC9tYXQtY2FyZD5cXG4gICAgICAgIDxtYXQtY2FyZD5cXG4gICAgICAgICAgICA8bWF0LWNhcmQtdGl0bGUgY2xhc3M9XFxcInBhZC1ib3R0b20tc21cXFwiIGlkPVxcXCJTbGlkZVRvZ2dsZVxcXCI+U2xpZGUgVG9nZ2xlIDxtYXQtaWNvbiBjbGFzcz1cXFwibGluay10by1jb21wb25lbnRcXFwiIHJvdXRlckxpbms9XFxcIi9cXFwiIGZyYWdtZW50PVxcXCJTbGlkZVRvZ2dsZVxcXCI+bGluazwvbWF0LWljb24+PC9tYXQtY2FyZC10aXRsZT5cXG4gICAgICAgICAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cXG4gICAgICAgICAgICA8bWF0LWNhcmQtY29udGVudD5cXG4gICAgICAgICAgICAgICAgPGgzIGNsYXNzPVxcXCJtZC10aXRsZVxcXCI+QmFzaWMgVXNhZ2U8L2gzPlxcbiAgICAgICAgICAgICAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cXG4gICAgICAgICAgICAgICAgPG1hdC1saXN0PlxcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1saXN0LWl0ZW0gKm5nRm9yPVxcXCJsZXQgc3lzdGVtIG9mIHN5c3RlbXNcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2xpZGUtdG9nZ2xlIFtjb2xvcl09XFxcInN5c3RlbS5jb2xvclxcXCIgWyhuZ01vZGVsKV09XFxcInN5c3RlbS5vblxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7c3lzdGVtLm5hbWV9fVxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWxpc3QtaXRlbT5cXG4gICAgICAgICAgICAgICAgPC9tYXQtbGlzdD5cXG4gICAgICAgICAgICAgICAgPGgzIGNsYXNzPVxcXCJtZC10aXRsZVxcXCI+VXNhZ2U8L2gzPlxcbiAgICAgICAgICAgICAgICA8cD5IVE1MOjwvcD5cXG4gICAgICAgICAgICAgICAgPHByZSBsYW5nPVxcXCJodG1sXFxcIj5cXG4gICAgICAgIDwhW0NEQVRBW1xcbiAgICAgICAgPCEtLSBCYXNpYyBVc2FnZSAtLT5cXG4gICAgICAgIDxtYXQtbGlzdD5cXG4gICAgICAgICAgICA8bWF0LWxpc3QtaXRlbSAqbmdGb3I9XFxcImxldCBzeXN0ZW0gb2Ygc3lzdGVtc1xcXCI+XFxuICAgICAgICAgICAgICA8bWF0LXNsaWRlLXRvZ2dsZSBbY29sb3JdPVxcXCJzeXN0ZW0uY29sb3JcXFwiIFsobmdNb2RlbCldPVxcXCJzeXN0ZW0ub25cXFwiPlxcbiAgICAgICAgICAgICAgICB7IHtzeXN0ZW0ubmFtZX0gfVxcbiAgICAgICAgICAgICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxcbiAgICAgICAgICAgIDwvbWF0LWxpc3QtaXRlbT5cXG4gICAgICAgIDwvbWF0LWxpc3Q+XFxuICAgICAgICBdXT5cXG4gICAgICAgIDwvcHJlPlxcbiAgICAgICAgICAgICAgICA8cD5KYXZhc2NyaXB0OjwvcD5cXG4gICAgICAgICAgICAgICAgPHByZSBsYW5nPVxcXCJqYXZhc2NyaXB0XFxcIj5cXG4gICAgICAgIDwhW0NEQVRBW1xcbiAgICAgICAgdGhpcy5zeXN0ZW1zID0gW3tcXG4gICAgICAgICAgICBuYW1lOiAnTGlnaHRzJyxcXG4gICAgICAgICAgICBvbjogZmFsc2UsXFxuICAgICAgICAgICAgY29sb3I6ICdwcmltYXJ5JyxcXG4gICAgICAgIH0sIHtcXG4gICAgICAgICAgICBuYW1lOiAnU3Vycm91bmQgU291bmQnLFxcbiAgICAgICAgICAgIG9uOiB0cnVlLFxcbiAgICAgICAgICAgIGNvbG9yOiAnYWNjZW50JyxcXG4gICAgICAgIH0sIHtcXG4gICAgICAgICAgICBuYW1lOiAnVC5WLicsXFxuICAgICAgICAgICAgb246IHRydWUsXFxuICAgICAgICAgICAgY29sb3I6ICd3YXJuJyxcXG4gICAgICAgIH0sIF07XFxuICAgICAgICAgICAgXV0+XFxuICAgICAgICAgIDwvcHJlPlxcbiAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XFxcIm1kLXRpdGxlXFxcIj5Vc2FnZSB3aXRoaW4gRm9ybXM8L2gzPlxcbiAgICAgICAgICAgICAgICA8Zm9ybT5cXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtbGlzdD5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxpc3QtaXRlbT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zbGlkZS10b2dnbGUgY29sb3I9XFxcImFjY2VudFxcXCIgWyhuZ01vZGVsKV09XFxcImhvdXNlLmxvY2tIb3VzZVxcXCIgbmFtZT1cXFwibG9ja0hvdXNlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2s/XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVxcXCJob3VzZS5sb2NrSG91c2VcXFwiIGNsYXNzPVxcXCJwYWQtcmlnaHQtc21cXFwiPmxvY2s8L21hdC1pY29uPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWxpc3QtaXRlbT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxpc3QtaXRlbT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zbGlkZS10b2dnbGUgZGlzYWJsZWQ+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJIGFtIGRpc2FibGVkLlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zbGlkZS10b2dnbGU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtbGlzdC1pdGVtPlxcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtbGlzdD5cXG4gICAgICAgICAgICAgICAgPC9mb3JtPlxcbiAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XFxcIm1kLXRpdGxlXFxcIj5Vc2FnZTwvaDM+XFxuICAgICAgICAgICAgICAgIDxwPkhUTUw6PC9wPlxcbiAgICAgICAgICAgICAgICA8cHJlIGxhbmc9XFxcImh0bWxcXFwiPlxcbiAgICAgICAgPCFbQ0RBVEFbXFxuICAgICAgICA8IS0tIFVzYWdlIHdpdGhpbiBGb3JtcyAtLT5cXG4gICAgICAgIDxmb3JtPlxcbiAgICAgICAgICAgIDxtYXQtbGlzdD5cXG4gICAgICAgICAgICAgICAgPG1hdC1saXN0LWl0ZW0+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LXNsaWRlLXRvZ2dsZSBjb2xvcj1cXFwiYWNjZW50XFxcIiBbKG5nTW9kZWwpXT1cXFwiaG91c2UubG9ja0hvdXNlXFxcIiBuYW1lPVxcXCJsb2NrSG91c2VcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIExvY2s/XFxuICAgICAgICAgICAgICAgICAgICA8L21hdC1zbGlkZS10b2dnbGU+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XFxcImhvdXNlLmxvY2tIb3VzZVxcXCIgY2xhc3M9XFxcInBhZC1yaWdodC1zbVxcXCI+bG9jazwvbWF0LWljb24+XFxuICAgICAgICAgICAgICAgIDwvbWF0LWxpc3QtaXRlbT5cXG4gICAgICAgICAgICAgICAgPG1hdC1saXN0LWl0ZW0+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LXNsaWRlLXRvZ2dsZSBkaXNhYmxlZD5cXG4gICAgICAgICAgICAgICAgICAgIEkgYW0gZGlzYWJsZWQuXFxuICAgICAgICAgICAgICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cXG4gICAgICAgICAgICAgICAgPC9tYXQtbGlzdC1pdGVtPlxcbiAgICAgICAgICAgIDwvbWF0LWxpc3Q+XFxuICAgICAgICA8L2Zvcm0+XFxuICAgICAgICBdXT5cXG4gICAgICAgIDwvcHJlPlxcbiAgICAgICAgICAgICAgICA8cD5KYXZhc2NyaXB0OjwvcD5cXG4gICAgICAgICAgICAgICAgPHByZSBsYW5nPVxcXCJqYXZhc2NyaXB0XFxcIj5cXG4gICAgICAgIDwhW0NEQVRBW1xcbiAgICAgICAgdGhpcy5ob3VzZSA9IHtcXG4gICAgICAgICAgICBsb2NrSG91c2U6IGZhbHNlLFxcbiAgICAgICAgfTtcXG4gICAgICAgICAgICBdXT5cXG4gICAgICAgICAgPC9wcmU+XFxuICAgICAgICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxcbiAgICAgICAgPC9tYXQtY2FyZD5cXG4gICAgICAgIDxtYXQtY2FyZD5cXG4gICAgICAgICAgICA8bWF0LWNhcmQtdGl0bGUgY2xhc3M9XFxcInBhZC1ib3R0b20tc21cXFwiIGlkPVxcXCJTbGlkZXJcXFwiPlNsaWRlciA8bWF0LWljb24gY2xhc3M9XFxcImxpbmstdG8tY29tcG9uZW50XFxcIiByb3V0ZXJMaW5rPVxcXCIvXFxcIiBmcmFnbWVudD1cXFwiU2xpZGVyXFxcIj5saW5rPC9tYXQtaWNvbj48L21hdC1jYXJkLXRpdGxlPlxcbiAgICAgICAgICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxcbiAgICAgICAgICAgIDxtYXQtY2FyZC1jb250ZW50PlxcbiAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XFxcIm1kLXRpdGxlXFxcIj5Ib3Jpem9udGFsIFNsaWRlcjwvaDM+XFxuICAgICAgICAgICAgICAgIDxtYXQtc2xpZGVyIG1pbj1cXFwiMVxcXCIgbWF4PVxcXCI1XFxcIiB0aHVtYkxhYmVsIHRpY2tJbnRlcnZhbD1cXFwiMVxcXCIgdmFsdWU9XFxcIjJcXFwiIGNvbG9yPVxcXCJwcmltYXJ5XFxcIj48L21hdC1zbGlkZXI+XFxuICAgICAgICAgICAgICAgIDxtYXQtc2xpZGVyIHN0ZXA9XFxcIjVcXFwiIHRodW1iTGFiZWwgdGlja0ludGVydmFsPVxcXCI1XFxcIiB2YWx1ZT1cXFwiMjBcXFwiIGNvbG9yPVxcXCJhY2NlbnRcXFwiPjwvbWF0LXNsaWRlcj5cXG4gICAgICAgICAgICAgICAgPG1hdC1zbGlkZXIgdGh1bWJMYWJlbCB0aWNrLWludGVydmFsPVxcXCJhdXRvXFxcIiB2YWx1ZT1cXFwiMlxcXCIgY29sb3I9XFxcIndhcm5cXFwiPjwvbWF0LXNsaWRlcj5cXG4gICAgICAgICAgICAgICAgPGgzIGNsYXNzPVxcXCJtZC10aXRsZVxcXCI+VXNhZ2U8L2gzPlxcbiAgICAgICAgICAgICAgICA8cD5IVE1MOjwvcD5cXG4gICAgICAgICAgICAgICAgPHByZSBsYW5nPVxcXCJodG1sXFxcIj5cXG4gICAgICA8IVtDREFUQVtcXG4gICAgICAgIDxtYXQtc2xpZGVyIG1pbj1cXFwiMVxcXCIgbWF4PVxcXCI1XFxcIiB0aHVtYkxhYmVsIHRpY2tJbnRlcnZhbD1cXFwiMVxcXCIgdmFsdWU9XFxcIjJcXFwiIGNvbG9yPVxcXCJwcmltYXJ5XFxcIj48L21hdC1zbGlkZXI+XFxuICAgICAgICA8bWF0LXNsaWRlciBzdGVwPVxcXCI1XFxcIiB0aHVtYkxhYmVsIHRpY2tJbnRlcnZhbD1cXFwiNVxcXCIgdmFsdWU9XFxcIjIwXFxcIiBjb2xvcj1cXFwiYWNjZW50XFxcIj48L21hdC1zbGlkZXI+XFxuICAgICAgICA8bWF0LXNsaWRlciB0aHVtYkxhYmVsIHRpY2staW50ZXJ2YWw9XFxcImF1dG9cXFwiIHZhbHVlPVxcXCIyXFxcIiBjb2xvcj1cXFwid2FyblxcXCI+PC9tYXQtc2xpZGVyPlxcbiAgICAgICAgXV0+XFxuICAgICAgPC9wcmU+XFxuICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cXFwibWQtdGl0bGVcXFwiPlZlcnRpY2FsIFNsaWRlcjwvaDM+XFxuICAgICAgICAgICAgICAgIDxtYXQtc2xpZGVyIHZlcnRpY2FsIG1pbj1cXFwiMVxcXCIgbWF4PVxcXCIxMDBcXFwiIHRodW1iTGFiZWwgdGlja0ludGVydmFsPVxcXCIxMFxcXCIgdmFsdWU9XFxcIjJcXFwiPjwvbWF0LXNsaWRlcj5cXG4gICAgICAgICAgICAgICAgPGgzIGNsYXNzPVxcXCJtZC10aXRsZVxcXCI+VXNhZ2U8L2gzPlxcbiAgICAgICAgICAgICAgICA8cD5IVE1MOjwvcD5cXG4gICAgICAgICAgICAgICAgPHByZSBsYW5nPVxcXCJodG1sXFxcIj5cXG4gICAgICA8IVtDREFUQVtcXG4gICAgICAgIDxtYXQtc2xpZGVyIHZlcnRpY2FsIG1pbj1cXFwiMVxcXCIgbWF4PVxcXCIxMDBcXFwiIHRodW1iTGFiZWwgdGlja0ludGVydmFsPVxcXCIxMFxcXCIgdmFsdWU9XFxcIjJcXFwiPjwvbWF0LXNsaWRlcj5cXG4gICAgICAgIF1dPlxcbiAgICAgIDwvcHJlPlxcbiAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XFxcIm1kLXRpdGxlXFxcIj5JbnZlcnRlZCBTbGlkZXI8L2gzPlxcbiAgICAgICAgICAgICAgICA8bWF0LXNsaWRlciBpbnZlcnQgbWluPVxcXCIxXFxcIiBtYXg9XFxcIjEwMFxcXCIgdGh1bWJMYWJlbCB0aWNrSW50ZXJ2YWw9XFxcIjEwXFxcIiB2YWx1ZT1cXFwiMlxcXCI+PC9tYXQtc2xpZGVyPlxcbiAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XFxcIm1kLXRpdGxlXFxcIj5Vc2FnZTwvaDM+XFxuICAgICAgICAgICAgICAgIDxwPkhUTUw6PC9wPlxcbiAgICAgICAgICAgICAgICA8cHJlIGxhbmc9XFxcImh0bWxcXFwiPlxcbiAgICAgIDwhW0NEQVRBW1xcbiAgICAgICAgPG1hdC1zbGlkZXIgaW52ZXJ0IG1pbj1cXFwiMVxcXCIgbWF4PVxcXCIxMDBcXFwiIHRodW1iTGFiZWwgdGlja0ludGVydmFsPVxcXCIxMFxcXCIgdmFsdWU9XFxcIjJcXFwiPjwvbWF0LXNsaWRlcj5cXG4gICAgICAgIF1dPlxcbiAgICAgIDwvcHJlPlxcbiAgICAgICAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cXG4gICAgICAgIDwvbWF0LWNhcmQ+XFxuICAgIDwvZGl2PlxcbjwvbWF0LXNpZGVuYXYtY29udGFpbmVyPlxcblwiOyIsImZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cbi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmVcbiAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aFxuICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlxuICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjBcbiAqICh0aGUgJ0xpY2Vuc2UnKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoXG4gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAnQVMgSVMnIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUZERhdGFUYWJsZVNlcnZpY2UgfSBmcm9tICdAY292YWxlbnQvY29yZS9kYXRhLXRhYmxlJztcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsJztcbmltcG9ydCB7IEZkc0RpYWxvZ1NlcnZpY2UsIEZkc1NuYWNrQmFyU2VydmljZSwgRmRzQW5pbWF0aW9ucyB9IGZyb20gJ0BuaWZpLWZkcy9jb3JlJztcbmltcG9ydCBGZHNTZXJ2aWNlIGZyb20gJ3dlYmFwcC9zZXJ2aWNlcy9mZHMuc2VydmljZS5qcyc7XG5pbXBvcnQgRmRzRGVtb0RpYWxvZyBmcm9tICd3ZWJhcHAvY29tcG9uZW50cy9mbG93LWRlc2lnbi1zeXN0ZW0vZGlhbG9ncy9kZW1vL2Zkcy1kZW1vLWRpYWxvZy5qcyc7XG5cbnZhciBOVU1CRVJfRk9STUFUID0gZnVuY3Rpb24gTlVNQkVSX0ZPUk1BVCh2KSB7XG4gIHJldHVybiB2O1xufTtcblxudmFyIERFQ0lNQUxfRk9STUFUID0gZnVuY3Rpb24gREVDSU1BTF9GT1JNQVQodikge1xuICByZXR1cm4gdi50b0ZpeGVkKDIpO1xufTtcblxudmFyIGRhdGUgPSBuZXcgRGF0ZSgpO1xuLyoqXG4gKiBGZHNEZW1vIGNvbnN0cnVjdG9yLlxuICpcbiAqIEBwYXJhbSBGZHNTbmFja0JhclNlcnZpY2UgICAgVGhlIEZEUyBzbmFjayBiYXIgc2VydmljZSBtb2R1bGUuXG4gKiBAcGFyYW0gRmRzU2VydmljZSAgICAgICAgICAgIFRoZSBGRFMgc2VydmljZSBtb2R1bGUuXG4gKiBAcGFyYW0gZGlhbG9nICAgICAgICAgICAgICAgIFRoZSBhbmd1bGFyIG1hdGVyaWFsIGRpYWxvZyBtb2R1bGUuXG4gKiBAcGFyYW0gVGREaWFsb2dTZXJ2aWNlICAgICAgIFRoZSBjb3ZhbGVudCBkaWFsb2cgc2VydmljZSBtb2R1bGUuXG4gKiBAcGFyYW0gVGREYXRhVGFibGVTZXJ2aWNlICAgIFRoZSBjb3ZhbGVudCBkYXRhIHRhYmxlIHNlcnZpY2UgbW9kdWxlLlxuICogQGNvbnN0cnVjdG9yXG4gKi9cblxuZnVuY3Rpb24gRmRzRGVtbyhGZHNTbmFja0JhclNlcnZpY2UsIEZkc1NlcnZpY2UsIGRpYWxvZywgVGREYXRhVGFibGVTZXJ2aWNlLCBGZHNEaWFsb2dTZXJ2aWNlKSB7XG4gIHRoaXMuZmRzU2VydmljZSA9IEZkc1NlcnZpY2U7IC8vPGVkaXRvci1mb2xkIGRlc2M9J1NuYWNrIEJhcnMnPlxuXG4gIHRoaXMuc25hY2tCYXJTZXJ2aWNlID0gRmRzU25hY2tCYXJTZXJ2aWNlOyAvLzwvZWRpdG9yLWZvbGQ+XG4gIC8vPGVkaXRvci1mb2xkIGRlc2M9J0RpYWxvZyc+XG5cbiAgdGhpcy5kaWFsb2cgPSBkaWFsb2c7IC8vPC9lZGl0b3ItZm9sZD5cbiAgLy88ZWRpdG9yLWZvbGQgZGVzYz0nU2ltcGxlIERpYWxvZ3MnPlxuXG4gIHRoaXMuZGlhbG9nU2VydmljZSA9IEZkc0RpYWxvZ1NlcnZpY2U7IC8vPC9lZGl0b3ItZm9sZD5cbiAgLy88ZWRpdG9yLWZvbGQgZGVzYz0nRXhwYW5zaW9uIFBhbmVsJz5cblxuICB0aGlzLmV4cGFuZENvbGxhcHNlRXhwYW5zaW9uMU1zZyA9ICdObyBleHBhbmRlZC9jb2xsYXBzZWQgZGV0ZWN0ZWQgeWV0JztcbiAgdGhpcy5leHBhbnNpb24xID0gZmFsc2U7XG4gIHRoaXMuZGlzYWJsZWQgPSBmYWxzZTsgLy88L2VkaXRvci1mb2xkPlxuICAvLzxlZGl0b3ItZm9sZCBkZXNjPSdBdXRvY29tcGxldGUnPlxuXG4gIHRoaXMuY3VycmVudFN0YXRlID0gJyc7XG4gIHRoaXMucmVhY3RpdmVTdGF0ZXMgPSAnJztcbiAgdGhpcy50ZFN0YXRlcyA9IFtdO1xuICB0aGlzLnRkRGlzYWJsZWQgPSBmYWxzZTtcbiAgdGhpcy5zdGF0ZXMgPSBbe1xuICAgIGNvZGU6ICdBTCcsXG4gICAgbmFtZTogJ0FsYWJhbWEnXG4gIH0sIHtcbiAgICBjb2RlOiAnQUsnLFxuICAgIG5hbWU6ICdBbGFza2EnXG4gIH0sIHtcbiAgICBjb2RlOiAnQVonLFxuICAgIG5hbWU6ICdBcml6b25hJ1xuICB9LCB7XG4gICAgY29kZTogJ0FSJyxcbiAgICBuYW1lOiAnQXJrYW5zYXMnXG4gIH0sIHtcbiAgICBjb2RlOiAnQ0EnLFxuICAgIG5hbWU6ICdDYWxpZm9ybmlhJ1xuICB9LCB7XG4gICAgY29kZTogJ0NPJyxcbiAgICBuYW1lOiAnQ29sb3JhZG8nXG4gIH0sIHtcbiAgICBjb2RlOiAnQ1QnLFxuICAgIG5hbWU6ICdDb25uZWN0aWN1dCdcbiAgfSwge1xuICAgIGNvZGU6ICdERScsXG4gICAgbmFtZTogJ0RlbGF3YXJlJ1xuICB9LCB7XG4gICAgY29kZTogJ0ZMJyxcbiAgICBuYW1lOiAnRmxvcmlkYSdcbiAgfSwge1xuICAgIGNvZGU6ICdHQScsXG4gICAgbmFtZTogJ0dlb3JnaWEnXG4gIH0sIHtcbiAgICBjb2RlOiAnSEknLFxuICAgIG5hbWU6ICdIYXdhaWknXG4gIH0sIHtcbiAgICBjb2RlOiAnSUQnLFxuICAgIG5hbWU6ICdJZGFobydcbiAgfSwge1xuICAgIGNvZGU6ICdJTCcsXG4gICAgbmFtZTogJ0lsbGlub2lzJ1xuICB9LCB7XG4gICAgY29kZTogJ0lOJyxcbiAgICBuYW1lOiAnSW5kaWFuYSdcbiAgfSwge1xuICAgIGNvZGU6ICdJQScsXG4gICAgbmFtZTogJ0lvd2EnXG4gIH0sIHtcbiAgICBjb2RlOiAnS1MnLFxuICAgIG5hbWU6ICdLYW5zYXMnXG4gIH0sIHtcbiAgICBjb2RlOiAnS1knLFxuICAgIG5hbWU6ICdLZW50dWNreSdcbiAgfSwge1xuICAgIGNvZGU6ICdMQScsXG4gICAgbmFtZTogJ0xvdWlzaWFuYSdcbiAgfSwge1xuICAgIGNvZGU6ICdNRScsXG4gICAgbmFtZTogJ01haW5lJ1xuICB9LCB7XG4gICAgY29kZTogJ01EJyxcbiAgICBuYW1lOiAnTWFyeWxhbmQnXG4gIH0sIHtcbiAgICBjb2RlOiAnTUEnLFxuICAgIG5hbWU6ICdNYXNzYWNodXNldHRzJ1xuICB9LCB7XG4gICAgY29kZTogJ01JJyxcbiAgICBuYW1lOiAnTWljaGlnYW4nXG4gIH0sIHtcbiAgICBjb2RlOiAnTU4nLFxuICAgIG5hbWU6ICdNaW5uZXNvdGEnXG4gIH0sIHtcbiAgICBjb2RlOiAnTVMnLFxuICAgIG5hbWU6ICdNaXNzaXNzaXBwaSdcbiAgfSwge1xuICAgIGNvZGU6ICdNTycsXG4gICAgbmFtZTogJ01pc3NvdXJpJ1xuICB9LCB7XG4gICAgY29kZTogJ01UJyxcbiAgICBuYW1lOiAnTW9udGFuYSdcbiAgfSwge1xuICAgIGNvZGU6ICdORScsXG4gICAgbmFtZTogJ05lYnJhc2thJ1xuICB9LCB7XG4gICAgY29kZTogJ05WJyxcbiAgICBuYW1lOiAnTmV2YWRhJ1xuICB9LCB7XG4gICAgY29kZTogJ05IJyxcbiAgICBuYW1lOiAnTmV3IEhhbXBzaGlyZSdcbiAgfSwge1xuICAgIGNvZGU6ICdOSicsXG4gICAgbmFtZTogJ05ldyBKZXJzZXknXG4gIH0sIHtcbiAgICBjb2RlOiAnTk0nLFxuICAgIG5hbWU6ICdOZXcgTWV4aWNvJ1xuICB9LCB7XG4gICAgY29kZTogJ05ZJyxcbiAgICBuYW1lOiAnTmV3IFlvcmsnXG4gIH0sIHtcbiAgICBjb2RlOiAnTkMnLFxuICAgIG5hbWU6ICdOb3J0aCBDYXJvbGluYSdcbiAgfSwge1xuICAgIGNvZGU6ICdORCcsXG4gICAgbmFtZTogJ05vcnRoIERha290YSdcbiAgfSwge1xuICAgIGNvZGU6ICdPSCcsXG4gICAgbmFtZTogJ09oaW8nXG4gIH0sIHtcbiAgICBjb2RlOiAnT0snLFxuICAgIG5hbWU6ICdPa2xhaG9tYSdcbiAgfSwge1xuICAgIGNvZGU6ICdPUicsXG4gICAgbmFtZTogJ09yZWdvbidcbiAgfSwge1xuICAgIGNvZGU6ICdQQScsXG4gICAgbmFtZTogJ1Blbm5zeWx2YW5pYSdcbiAgfSwge1xuICAgIGNvZGU6ICdSSScsXG4gICAgbmFtZTogJ1Job2RlIElzbGFuZCdcbiAgfSwge1xuICAgIGNvZGU6ICdTQycsXG4gICAgbmFtZTogJ1NvdXRoIENhcm9saW5hJ1xuICB9LCB7XG4gICAgY29kZTogJ1NEJyxcbiAgICBuYW1lOiAnU291dGggRGFrb3RhJ1xuICB9LCB7XG4gICAgY29kZTogJ1ROJyxcbiAgICBuYW1lOiAnVGVubmVzc2VlJ1xuICB9LCB7XG4gICAgY29kZTogJ1RYJyxcbiAgICBuYW1lOiAnVGV4YXMnXG4gIH0sIHtcbiAgICBjb2RlOiAnVVQnLFxuICAgIG5hbWU6ICdVdGFoJ1xuICB9LCB7XG4gICAgY29kZTogJ1ZUJyxcbiAgICBuYW1lOiAnVmVybW9udCdcbiAgfSwge1xuICAgIGNvZGU6ICdWQScsXG4gICAgbmFtZTogJ1ZpcmdpbmlhJ1xuICB9LCB7XG4gICAgY29kZTogJ1dBJyxcbiAgICBuYW1lOiAnV2FzaGluZ3RvbidcbiAgfSwge1xuICAgIGNvZGU6ICdXVicsXG4gICAgbmFtZTogJ1dlc3QgVmlyZ2luaWEnXG4gIH0sIHtcbiAgICBjb2RlOiAnV0knLFxuICAgIG5hbWU6ICdXaXNjb25zaW4nXG4gIH0sIHtcbiAgICBjb2RlOiAnV1knLFxuICAgIG5hbWU6ICdXeW9taW5nJ1xuICB9XTsgLy88L2VkaXRvci1mb2xkPlxuICAvLzxlZGl0b3ItZm9sZCBkZXNjPSdTZWFyY2hhYmxlIEV4cGFuc2lvbiBQYW5lbHMnPlxuXG4gIHRoaXMuZGF0YVRhYmxlU2VydmljZSA9IFRkRGF0YVRhYmxlU2VydmljZTtcbiAgdGhpcy5kcm9wbGV0cyA9IFt7XG4gICAgaWQ6ICcyM2Y2Y2M1OS0wMTU2LTEwMDAtMDliNC0yYjA2MTAwODkwOTAnLFxuICAgIG5hbWU6ICdEZWNvbXByZXNzaW9uX0NpcmN1bGFyX0Zsb3cnLFxuICAgIGRpc3BsYXlOYW1lOiAnRGVjb21wcmVzc2VkIENpcmN1bGFyIGZsb3cnLFxuICAgIHR5cGU6ICdmbG93JyxcbiAgICBzdWJsYWJlbDogJ0Egc3VibGFiZWwnLFxuICAgIGNvbXBsaWFudDoge1xuICAgICAgaWQ6ICcyNWZkNnZ2ODctMzU0OS0wMDAxLTA1ZzYtNGQ0NTY3ODkwNzY1JyxcbiAgICAgIGxhYmVsOiAnQ29tcGxpYW50JyxcbiAgICAgIHR5cGU6ICdjZXJ0aWZpY2F0aW9uJ1xuICAgIH0sXG4gICAgZmxlZXQ6IHtcbiAgICAgIGlkOiAnMjNmNmNjNTktMzU0OS0wMDAxLTA1ZzYtNGQ0NTY3ODkwNzY1JyxcbiAgICAgIGxhYmVsOiAnRmxlZXQnLFxuICAgICAgdHlwZTogJ2NlcnRpZmljYXRpb24nXG4gICAgfSxcbiAgICBwcm9kOiB7XG4gICAgICBpZDogJzUyZmQ2dnY4Ny0zNTQ5LTAwMDEtMDVnNi00ZDQ1Njc4OTA3NjUnLFxuICAgICAgbGFiZWw6ICdQcm9kdWN0aW9uIFJlYWR5JyxcbiAgICAgIHR5cGU6ICdjZXJ0aWZpY2F0aW9uJ1xuICAgIH0sXG4gICAgc2VjdXJlOiB7XG4gICAgICBpZDogJzMyZjZjYzU5LTM1NDktMDAwMS0wNWc2LTRkNDU2Nzg5MDc2NScsXG4gICAgICBsYWJlbDogJ1NlY3VyZScsXG4gICAgICB0eXBlOiAnY2VydGlmaWNhdGlvbidcbiAgICB9LFxuICAgIHZlcnNpb25zOiBbe1xuICAgICAgaWQ6ICcyM2Y2Y2M1OS0wMTU2LTEwMDAtMDZiNC0yYjA4MTAwODkwOTAnLFxuICAgICAgcmV2aXNpb246ICcxJyxcbiAgICAgIGRlcGVuZGVudEZsb3dzOiBbe1xuICAgICAgICBpZDogJzI1ZmQ2dnY4Ny0zNTQ5LTAwMDEtMDVnNi00ZDQ1Njc4OTA3NjUnXG4gICAgICB9XSxcbiAgICAgIGNyZWF0ZWQ6IGRhdGUuc2V0RGF0ZShkYXRlLmdldERhdGUoKSAtIDEpLFxuICAgICAgdXBkYXRlZDogbmV3IERhdGUoKVxuICAgIH0sIHtcbiAgICAgIGlkOiAnMjVmZDZ2djg3LTM1NDktMDAwMS0wNWc2LTRkNDU2Nzg5MDc2NScsXG4gICAgICByZXZpc2lvbjogJzInLFxuICAgICAgZGVwZW5kZW50Rmxvd3M6IFt7XG4gICAgICAgIGlkOiAnMjNmNmNjNTktMDE1Ni0xMDAwLTA2YjQtMmIwODEwMDg5MDkwJ1xuICAgICAgfV0sXG4gICAgICBjcmVhdGVkOiBuZXcgRGF0ZSgpLFxuICAgICAgdXBkYXRlZDogbmV3IERhdGUoKVxuICAgIH1dLFxuICAgIGZsb3dzOiBbXSxcbiAgICBleHRlbnNpb25zOiBbXSxcbiAgICBhc3NldHM6IFtdLFxuICAgIGFjdGlvbnM6IFt7XG4gICAgICAnbmFtZSc6ICdEZWxldGUnLFxuICAgICAgJ2ljb24nOiAnZmEgZmEtY2xvc2UnLFxuICAgICAgJ3Rvb2x0aXAnOiAnRGVsZXRlIFVzZXInXG4gICAgfSwge1xuICAgICAgJ25hbWUnOiAnTWFuYWdlJyxcbiAgICAgICdpY29uJzogJ2ZhIGZhLXVzZXInLFxuICAgICAgJ3Rvb2x0aXAnOiAnTWFuYWdlIFVzZXInXG4gICAgfSwge1xuICAgICAgJ25hbWUnOiAnQWN0aW9uIDMnLFxuICAgICAgJ2ljb24nOiAnZmEgZmEtcXVlc3Rpb24nLFxuICAgICAgJ3Rvb2x0aXAnOiAnV2hhdGV2ZXIgZWxzZSB3ZSB3YW50IHRvIGRvLi4uJ1xuICAgIH1dXG4gIH0sIHtcbiAgICBpZDogJzI1ZmQ2dnY4Ny0zMjQ5LTAwMDEtMDVnNi00ZDQ3Njc4OTA3NjUnLFxuICAgIG5hbWU6ICdEYXRlQ29udmVyc2lvbicsXG4gICAgZGlzcGxheU5hbWU6ICdEYXRlIGNvbnZlcnNpb24nLFxuICAgIHR5cGU6ICdhc3NldCcsXG4gICAgc3VibGFiZWw6ICdBIHN1YmxhYmVsJyxcbiAgICBjb21wbGlhbnQ6IHtcbiAgICAgIGlkOiAnMjVmZDZ2djM0LTM1NDktMDAwMS0wNWc2LTRkNDU2Nzg5MDc2NScsXG4gICAgICBsYWJlbDogJ0NvbXBsaWFudCcsXG4gICAgICB0eXBlOiAnY2VydGlmaWNhdGlvbidcbiAgICB9LFxuICAgIHByb2Q6IHtcbiAgICAgIGlkOiAnNTJ2bjZ2djg3LTM1NDktMDAwMS0wNWc2LTRkNDU2Nzg5MDc2NScsXG4gICAgICBsYWJlbDogJ1Byb2R1Y3Rpb24gUmVhZHknLFxuICAgICAgdHlwZTogJ2NlcnRpZmljYXRpb24nXG4gICAgfSxcbiAgICB2ZXJzaW9uczogW3tcbiAgICAgIGlkOiAnMjNmNmljNTktMDE1Ni0xMDAwLTA2YjQtMmIwODEwMDg5MDkwJyxcbiAgICAgIHJldmlzaW9uOiAnMScsXG4gICAgICBkZXBlbmRlbnRGbG93czogW3tcbiAgICAgICAgaWQ6ICcyM2Y2Y2MxOS0wMTU2LTEwMDAtMDZiNC0yYjA4MTAwODkwOTAnXG4gICAgICB9XSxcbiAgICAgIGNyZWF0ZWQ6IG5ldyBEYXRlKCksXG4gICAgICB1cGRhdGVkOiBuZXcgRGF0ZSgpXG4gICAgfV0sXG4gICAgZmxvd3M6IFtdLFxuICAgIGV4dGVuc2lvbnM6IFtdLFxuICAgIGFzc2V0czogW10sXG4gICAgYWN0aW9uczogW3tcbiAgICAgICduYW1lJzogJ0RlbGV0ZScsXG4gICAgICAnaWNvbic6ICdmYSBmYS1jbG9zZScsXG4gICAgICAndG9vbHRpcCc6ICdEZWxldGUgVXNlcidcbiAgICB9XVxuICB9LCB7XG4gICAgaWQ6ICc1MmZkNnZ2ODctMzI5NC0wMDAxLTA1ZzYtNGQ0NzY3ODkwNzY1JyxcbiAgICBuYW1lOiAnbmlmaS1lbWFpbC1idW5kbGUnLFxuICAgIGRpc3BsYXlOYW1lOiAnbmlmaS1lbWFpbC1idW5kbGUnLFxuICAgIHR5cGU6ICdleHRlbnNpb24nLFxuICAgIHN1YmxhYmVsOiAnQSBzdWJsYWJlbCcsXG4gICAgY29tcGxpYW50OiB7XG4gICAgICBpZDogJzMzZmQ2dnY4Ny0zNTQ5LTAwMDEtMDVnNi00ZDQ1Njc4OTA3NjUnLFxuICAgICAgbGFiZWw6ICdDb21wbGlhbnQnLFxuICAgICAgdGVzdDoge1xuICAgICAgICBsYWJlbDogJ3Rlc3QnXG4gICAgICB9LFxuICAgICAgdHlwZTogJ2NlcnRpZmljYXRpb24nXG4gICAgfSxcbiAgICB2ZXJzaW9uczogW3tcbiAgICAgIGlkOiAnMjNkM2NjNTktMDE1Ni0xMDAwLTA2YjQtMmIwODEwMDg5MDkwJyxcbiAgICAgIHJldmlzaW9uOiAnMScsXG4gICAgICBkZXBlbmRlbnRGbG93czogW3tcbiAgICAgICAgaWQ6ICcyM2Y2Y2M4OS0wMTU2LTEwMDAtMDZiNC0yYjA4MTAwODkwOTAnXG4gICAgICB9XSxcbiAgICAgIGNyZWF0ZWQ6IG5ldyBEYXRlKCksXG4gICAgICB1cGRhdGVkOiBuZXcgRGF0ZSgpXG4gICAgfV0sXG4gICAgZmxvd3M6IFtdLFxuICAgIGV4dGVuc2lvbnM6IFtdLFxuICAgIGFzc2V0czogW10sXG4gICAgYWN0aW9uczogW3tcbiAgICAgICduYW1lJzogJ0RlbGV0ZScsXG4gICAgICAnaWNvbic6ICdmYSBmYS1jbG9zZScsXG4gICAgICAndG9vbHRpcCc6ICdEZWxldGUgVXNlcidcbiAgICB9LCB7XG4gICAgICAnbmFtZSc6ICdNYW5hZ2UnLFxuICAgICAgJ2ljb24nOiAnZmEgZmEtdXNlcicsXG4gICAgICAndG9vbHRpcCc6ICdNYW5hZ2UgVXNlcidcbiAgICB9XVxuICB9XTtcbiAgdGhpcy5maWx0ZXJlZERyb3BsZXRzID0gW107XG4gIHRoaXMuZHJvcGxldENvbHVtbnMgPSBbe1xuICAgIG5hbWU6ICdpZCcsXG4gICAgbGFiZWw6ICdJRCcsXG4gICAgc29ydGFibGU6IHRydWVcbiAgfSwge1xuICAgIG5hbWU6ICduYW1lJyxcbiAgICBsYWJlbDogJ05hbWUnLFxuICAgIHNvcnRhYmxlOiB0cnVlXG4gIH0sIHtcbiAgICBuYW1lOiAnZGlzcGxheU5hbWUnLFxuICAgIGxhYmVsOiAnRGlzcGxheSBOYW1lJyxcbiAgICBzb3J0YWJsZTogdHJ1ZVxuICB9LCB7XG4gICAgbmFtZTogJ3N1YmxhYmVsJyxcbiAgICBsYWJlbDogJ0xhYmVsJyxcbiAgICBzb3J0YWJsZTogdHJ1ZVxuICB9LCB7XG4gICAgbmFtZTogJ3R5cGUnLFxuICAgIGxhYmVsOiAnVHlwZScsXG4gICAgc29ydGFibGU6IHRydWVcbiAgfV07XG4gIHRoaXMuYWN0aXZlRHJvcGxldENvbHVtbiA9IHRoaXMuZHJvcGxldENvbHVtbnNbMF07XG4gIHRoaXMuYXV0b0NvbXBsZXRlRHJvcGxldHMgPSBbXTtcbiAgdGhpcy5kcm9wbGV0c1NlYXJjaFRlcm1zID0gW107IC8vPC9lZGl0b3ItZm9sZD5cbiAgLy88ZWRpdG9yLWZvbGQgZGVzYz0nRGF0YSBUYWJsZXMnPlxuXG4gIHRoaXMuZGF0YSA9IFt7XG4gICAgJ2lkJzogMSxcbiAgICAnbmFtZSc6ICdGcm96ZW4geW9ndXJ0JyxcbiAgICAndHlwZSc6ICdJY2UgY3JlYW0nLFxuICAgICdjYWxvcmllcyc6IDE1OS4wLFxuICAgICdmYXQnOiA2LjAsXG4gICAgJ2NhcmJzJzogMjQuMCxcbiAgICAncHJvdGVpbic6IDQuMCxcbiAgICAnc29kaXVtJzogODcuMCxcbiAgICAnY2FsY2l1bSc6IDE0LjAsXG4gICAgJ2lyb24nOiAxLjAsXG4gICAgJ2NvbW1lbnRzJzogJ0kgbG92ZSBmcm95byEnLFxuICAgICdhY3Rpb25zJzogW3tcbiAgICAgICduYW1lJzogJ0FjdGlvbiAxJyxcbiAgICAgICdpY29uJzogJ2ZhIGZhLXVzZXInLFxuICAgICAgJ3Rvb2x0aXAnOiAnTWFuYWdlIFVzZXJzJ1xuICAgIH0sIHtcbiAgICAgICduYW1lJzogJ0FjdGlvbiAyJyxcbiAgICAgICdpY29uJzogJ2ZhIGZhLWtleScsXG4gICAgICAndG9vbHRpcCc6ICdNYW5hZ2UgUGVybWlzc2lvbnMnXG4gICAgfV1cbiAgfSwge1xuICAgICdpZCc6IDIsXG4gICAgJ25hbWUnOiAnSWNlIGNyZWFtIHNhbmR3aWNoJyxcbiAgICAndHlwZSc6ICdJY2UgY3JlYW0nLFxuICAgICdjYWxvcmllcyc6IDIzNy4wLFxuICAgICdmYXQnOiA5LjAsXG4gICAgJ2NhcmJzJzogMzcuMCxcbiAgICAncHJvdGVpbic6IDQuMyxcbiAgICAnc29kaXVtJzogMTI5LjAsXG4gICAgJ2NhbGNpdW0nOiA4LjAsXG4gICAgJ2lyb24nOiAxLjAsXG4gICAgJ2FjdGlvbnMnOiBbe1xuICAgICAgJ25hbWUnOiAnQWN0aW9uIDEnLFxuICAgICAgJ2ljb24nOiAnZmEgZmEtdXNlcicsXG4gICAgICAndG9vbHRpcCc6ICdNYW5hZ2UgVXNlcnMnXG4gICAgfSwge1xuICAgICAgJ25hbWUnOiAnQWN0aW9uIDInLFxuICAgICAgJ2ljb24nOiAnZmEgZmEta2V5JyxcbiAgICAgICd0b29sdGlwJzogJ01hbmFnZSBQZXJtaXNzaW9ucydcbiAgICB9LCB7XG4gICAgICAnbmFtZSc6ICdBY3Rpb24gMycsXG4gICAgICAndG9vbHRpcCc6ICdBY3Rpb24gMydcbiAgICB9LCB7XG4gICAgICAnbmFtZSc6ICdBY3Rpb24gNCcsXG4gICAgICAnZGlzYWJsZWQnOiB0cnVlLFxuICAgICAgJ3Rvb2x0aXAnOiAnQWN0aW9uIDQnXG4gICAgfSwge1xuICAgICAgJ25hbWUnOiAnQWN0aW9uIDUnLFxuICAgICAgJ3Rvb2x0aXAnOiAnQWN0aW9uIDUnXG4gICAgfV1cbiAgfSwge1xuICAgICdpZCc6IDMsXG4gICAgJ25hbWUnOiAnRWNsYWlyJyxcbiAgICAndHlwZSc6ICdQYXN0cnknLFxuICAgICdjYWxvcmllcyc6IDI2Mi4wLFxuICAgICdmYXQnOiAxNi4wLFxuICAgICdjYXJicyc6IDI0LjAsXG4gICAgJ3Byb3RlaW4nOiA2LjAsXG4gICAgJ3NvZGl1bSc6IDMzNy4wLFxuICAgICdjYWxjaXVtJzogNi4wLFxuICAgICdpcm9uJzogNy4wLFxuICAgICdhY3Rpb25zJzogW3tcbiAgICAgICduYW1lJzogJ0FjdGlvbiAxJyxcbiAgICAgICdpY29uJzogJ2ZhIGZhLXVzZXInLFxuICAgICAgJ3Rvb2x0aXAnOiAnTWFuYWdlIFVzZXJzJ1xuICAgIH0sIHtcbiAgICAgICduYW1lJzogJ0FjdGlvbiAyJyxcbiAgICAgICdpY29uJzogJ2ZhIGZhLWtleScsXG4gICAgICAndG9vbHRpcCc6ICdNYW5hZ2UgUGVybWlzc2lvbnMnXG4gICAgfSwge1xuICAgICAgJ25hbWUnOiAnQWN0aW9uIDMnLFxuICAgICAgJ3Rvb2x0aXAnOiAnQWN0aW9uIDMnXG4gICAgfSwge1xuICAgICAgJ25hbWUnOiAnQWN0aW9uIDQnLFxuICAgICAgJ2Rpc2FibGVkJzogdHJ1ZSxcbiAgICAgICd0b29sdGlwJzogJ0FjdGlvbiA0J1xuICAgIH0sIHtcbiAgICAgICduYW1lJzogJ0FjdGlvbiA1JyxcbiAgICAgICd0b29sdGlwJzogJ0FjdGlvbiA1J1xuICAgIH1dXG4gIH0sIHtcbiAgICAnaWQnOiA0LFxuICAgICduYW1lJzogJ0N1cGNha2UnLFxuICAgICd0eXBlJzogJ1Bhc3RyeScsXG4gICAgJ2NhbG9yaWVzJzogMzA1LjAsXG4gICAgJ2ZhdCc6IDMuNyxcbiAgICAnY2FyYnMnOiA2Ny4wLFxuICAgICdwcm90ZWluJzogNC4zLFxuICAgICdzb2RpdW0nOiA0MTMuMCxcbiAgICAnY2FsY2l1bSc6IDMuMCxcbiAgICAnaXJvbic6IDguMCxcbiAgICAnYWN0aW9ucyc6IFt7XG4gICAgICAnbmFtZSc6ICdBY3Rpb24gMScsXG4gICAgICAnaWNvbic6ICdmYSBmYS11c2VyJyxcbiAgICAgICd0b29sdGlwJzogJ01hbmFnZSBVc2VycydcbiAgICB9LCB7XG4gICAgICAnbmFtZSc6ICdBY3Rpb24gMicsXG4gICAgICAnaWNvbic6ICdmYSBmYS1rZXknLFxuICAgICAgJ3Rvb2x0aXAnOiAnTWFuYWdlIFBlcm1pc3Npb25zJ1xuICAgIH0sIHtcbiAgICAgICduYW1lJzogJ0FjdGlvbiAzJyxcbiAgICAgICd0b29sdGlwJzogJ0FjdGlvbiAzJ1xuICAgIH0sIHtcbiAgICAgICduYW1lJzogJ0FjdGlvbiA0JyxcbiAgICAgICdkaXNhYmxlZCc6IHRydWUsXG4gICAgICAndG9vbHRpcCc6ICdBY3Rpb24gNCdcbiAgICB9LCB7XG4gICAgICAnbmFtZSc6ICdBY3Rpb24gNScsXG4gICAgICAndG9vbHRpcCc6ICdBY3Rpb24gNSdcbiAgICB9XVxuICB9LCB7XG4gICAgJ2lkJzogNSxcbiAgICAnbmFtZSc6ICdKZWxseSBiZWFuJyxcbiAgICAndHlwZSc6ICdDYW5keScsXG4gICAgJ2NhbG9yaWVzJzogMzc1LjAsXG4gICAgJ2ZhdCc6IDAuMCxcbiAgICAnY2FyYnMnOiA5NC4wLFxuICAgICdwcm90ZWluJzogMC4wLFxuICAgICdzb2RpdW0nOiA1MC4wLFxuICAgICdjYWxjaXVtJzogMC4wLFxuICAgICdpcm9uJzogMC4wXG4gIH0sIHtcbiAgICAnaWQnOiA2LFxuICAgICduYW1lJzogJ0xvbGxpcG9wJyxcbiAgICAndHlwZSc6ICdDYW5keScsXG4gICAgJ2NhbG9yaWVzJzogMzkyLjAsXG4gICAgJ2ZhdCc6IDAuMixcbiAgICAnY2FyYnMnOiA5OC4wLFxuICAgICdwcm90ZWluJzogMC4wLFxuICAgICdzb2RpdW0nOiAzOC4wLFxuICAgICdjYWxjaXVtJzogMC4wLFxuICAgICdpcm9uJzogMi4wXG4gIH0sIHtcbiAgICAnaWQnOiA3LFxuICAgICduYW1lJzogJ0hvbmV5Y29tYicsXG4gICAgJ3R5cGUnOiAnT3RoZXInLFxuICAgICdjYWxvcmllcyc6IDQwOC4wLFxuICAgICdmYXQnOiAzLjIsXG4gICAgJ2NhcmJzJzogODcuMCxcbiAgICAncHJvdGVpbic6IDYuNSxcbiAgICAnc29kaXVtJzogNTYyLjAsXG4gICAgJ2NhbGNpdW0nOiAwLjAsXG4gICAgJ2lyb24nOiA0NS4wXG4gIH0sIHtcbiAgICAnaWQnOiA4LFxuICAgICduYW1lJzogJ0RvbnV0JyxcbiAgICAndHlwZSc6ICdQYXN0cnknLFxuICAgICdjYWxvcmllcyc6IDQ1Mi4wLFxuICAgICdmYXQnOiAyNS4wLFxuICAgICdjYXJicyc6IDUxLjAsXG4gICAgJ3Byb3RlaW4nOiA0LjksXG4gICAgJ3NvZGl1bSc6IDMyNi4wLFxuICAgICdjYWxjaXVtJzogMi4wLFxuICAgICdpcm9uJzogMjIuMFxuICB9LCB7XG4gICAgJ2lkJzogOSxcbiAgICAnbmFtZSc6ICdLaXRLYXQnLFxuICAgICd0eXBlJzogJ0NhbmR5JyxcbiAgICAnY2Fsb3JpZXMnOiA1MTguMCxcbiAgICAnZmF0JzogMjYuMCxcbiAgICAnY2FyYnMnOiA2NS4wLFxuICAgICdwcm90ZWluJzogNy4wLFxuICAgICdzb2RpdW0nOiA1NC4wLFxuICAgICdjYWxjaXVtJzogMTIuMCxcbiAgICAnaXJvbic6IDYuMFxuICB9LCB7XG4gICAgJ2lkJzogMTAsXG4gICAgJ25hbWUnOiAnQ2hvY29sYXRlJyxcbiAgICAndHlwZSc6ICdDYW5keScsXG4gICAgJ2NhbG9yaWVzJzogNTE4LjAsXG4gICAgJ2ZhdCc6IDI2LjAsXG4gICAgJ2NhcmJzJzogNjUuMCxcbiAgICAncHJvdGVpbic6IDcuMCxcbiAgICAnc29kaXVtJzogNTQuMCxcbiAgICAnY2FsY2l1bSc6IDEyLjAsXG4gICAgJ2lyb24nOiA2LjBcbiAgfSwge1xuICAgICdpZCc6IDExLFxuICAgICduYW1lJzogJ0NoYW1veScsXG4gICAgJ3R5cGUnOiAnQ2FuZHknLFxuICAgICdjYWxvcmllcyc6IDUxOC4wLFxuICAgICdmYXQnOiAyNi4wLFxuICAgICdjYXJicyc6IDY1LjAsXG4gICAgJ3Byb3RlaW4nOiA3LjAsXG4gICAgJ3NvZGl1bSc6IDU0LjAsXG4gICAgJ2NhbGNpdW0nOiAxMi4wLFxuICAgICdpcm9uJzogNi4wXG4gIH1dO1xuICB0aGlzLmZpbHRlcmVkRGF0YSA9IHRoaXMuZGF0YTtcbiAgdGhpcy5maWx0ZXJlZFRvdGFsID0gdGhpcy5kYXRhLmxlbmd0aDtcbiAgdGhpcy5jb2x1bW5zID0gW3tcbiAgICBuYW1lOiAnY29tbWVudHMnLFxuICAgIGxhYmVsOiAnQ29tbWVudHMnLFxuICAgIHdpZHRoOiAxMFxuICB9LCB7XG4gICAgbmFtZTogJ25hbWUnLFxuICAgIGxhYmVsOiAnRGVzc2VydCAoMTAwZyBzZXJ2aW5nKScsXG4gICAgc29ydGFibGU6IHRydWUsXG4gICAgd2lkdGg6IDEwXG4gIH0sIHtcbiAgICBuYW1lOiAndHlwZScsXG4gICAgbGFiZWw6ICdUeXBlJyxcbiAgICBzb3J0YWJsZTogdHJ1ZSxcbiAgICB3aWR0aDogMTBcbiAgfSwge1xuICAgIG5hbWU6ICdjYWxvcmllcycsXG4gICAgbGFiZWw6ICdDYWxvcmllcycsXG4gICAgbnVtZXJpYzogdHJ1ZSxcbiAgICBmb3JtYXQ6IE5VTUJFUl9GT1JNQVQsXG4gICAgc29ydGFibGU6IHRydWUsXG4gICAgd2lkdGg6IDEwXG4gIH0sIHtcbiAgICBuYW1lOiAnZmF0JyxcbiAgICBsYWJlbDogJ0ZhdCAoZyknLFxuICAgIG51bWVyaWM6IHRydWUsXG4gICAgZm9ybWF0OiBERUNJTUFMX0ZPUk1BVCxcbiAgICBzb3J0YWJsZTogdHJ1ZSxcbiAgICB3aWR0aDogMTBcbiAgfSwge1xuICAgIG5hbWU6ICdjYXJicycsXG4gICAgbGFiZWw6ICdDYXJicyAoZyknLFxuICAgIG51bWVyaWM6IHRydWUsXG4gICAgZm9ybWF0OiBOVU1CRVJfRk9STUFULFxuICAgIHNvcnRhYmxlOiB0cnVlLFxuICAgIHdpZHRoOiAxMFxuICB9LCB7XG4gICAgbmFtZTogJ3Byb3RlaW4nLFxuICAgIGxhYmVsOiAnUHJvdGVpbiAoZyknLFxuICAgIG51bWVyaWM6IHRydWUsXG4gICAgZm9ybWF0OiBERUNJTUFMX0ZPUk1BVCxcbiAgICBzb3J0YWJsZTogdHJ1ZSxcbiAgICB3aWR0aDogMTBcbiAgfSwge1xuICAgIG5hbWU6ICdzb2RpdW0nLFxuICAgIGxhYmVsOiAnU29kaXVtIChtZyknLFxuICAgIG51bWVyaWM6IHRydWUsXG4gICAgZm9ybWF0OiBOVU1CRVJfRk9STUFULFxuICAgIHNvcnRhYmxlOiB0cnVlLFxuICAgIHdpZHRoOiAxMFxuICB9LCB7XG4gICAgbmFtZTogJ2NhbGNpdW0nLFxuICAgIGxhYmVsOiAnQ2FsY2l1bSAoJSknLFxuICAgIG51bWVyaWM6IHRydWUsXG4gICAgZm9ybWF0OiBOVU1CRVJfRk9STUFULFxuICAgIHNvcnRhYmxlOiB0cnVlLFxuICAgIHdpZHRoOiAxMFxuICB9LCB7XG4gICAgbmFtZTogJ2lyb24nLFxuICAgIGxhYmVsOiAnSXJvbiAoJSknLFxuICAgIG51bWVyaWM6IHRydWUsXG4gICAgZm9ybWF0OiBOVU1CRVJfRk9STUFULFxuICAgIHdpZHRoOiAxMFxuICB9XTtcbiAgdGhpcy5hbGxSb3dzU2VsZWN0ZWQgPSBmYWxzZTtcbiAgdGhpcy5hdXRvQ29tcGxldGVEYXRhID0gW107XG4gIHRoaXMuc2VsZWN0ZWRSb3dzID0gW107XG4gIHRoaXMuc2VhcmNoVGVybSA9IFtdO1xuICB0aGlzLmZyb21Sb3cgPSAxO1xuICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcbiAgdGhpcy5wYWdlU2l6ZSA9IDU7XG4gIHRoaXMucGFnZUNvdW50ID0gMDsgLy88L2VkaXRvci1mb2xkPlxuICAvLzxlZGl0b3ItZm9sZCBkZXNjPSdDaGlwcyAkIEF1dG9jb21wbGV0ZSc+XG5cbiAgdGhpcy5yZWFkT25seSA9IGZhbHNlO1xuICB0aGlzLml0ZW1zID0gWydzdGVwcGVyJywgJ2V4cGFuc2lvbi1wYW5lbCcsICdtYXJrZG93bicsICdoaWdobGlnaHQnLCAnbG9hZGluZycsICdtZWRpYScsICdjaGlwcycsICdodHRwJywgJ2pzb24tZm9ybWF0dGVyJywgJ3BpcGVzJywgJ25lZWQgbW9yZT8nXTtcbiAgdGhpcy5pdGVtc1JlcXVpcmVNYXRjaCA9IHRoaXMuaXRlbXMuc2xpY2UoMCwgNik7IC8vPC9lZGl0b3ItZm9sZD5cbiAgLy88ZWRpdG9yLWZvbGQgZGVzYz0nUmFkaW9zJz5cblxuICB0aGlzLmZhdm9yaXRlU2Vhc29uID0gJ0F1dHVtbic7XG4gIHRoaXMuc2Vhc29uT3B0aW9ucyA9IFsnV2ludGVyJywgJ1NwcmluZycsICdTdW1tZXInLCAnQXV0dW1uJ107IC8vPC9lZGl0b3ItZm9sZD5cbiAgLy88ZWRpdG9yLWZvbGQgZGVzYz0nU2VsZWN0Jz5cblxuICB0aGlzLnNlbGVjdGVkVmFsdWUgPSAnJztcbiAgdGhpcy5mb29kcyA9IFt7XG4gICAgdmFsdWU6ICdzdGVhay0wJyxcbiAgICB2aWV3VmFsdWU6ICdTdGVhaydcbiAgfSwge1xuICAgIHZhbHVlOiAncGl6emEtMScsXG4gICAgdmlld1ZhbHVlOiAnUGl6emEnXG4gIH0sIHtcbiAgICB2YWx1ZTogJ3RhY29zLTInLFxuICAgIHZpZXdWYWx1ZTogJ1RhY29zJ1xuICB9XTsgLy88L2VkaXRvci1mb2xkPlxuICAvLzxlZGl0b3ItZm9sZCBkZXNjPSdDaGVja2JveCc+XG5cbiAgdGhpcy51c2VyID0ge1xuICAgIGFncmVlc1RvVE9TOiBmYWxzZVxuICB9O1xuICB0aGlzLmdyb2NlcmllcyA9IFt7XG4gICAgYm91Z2h0OiB0cnVlLFxuICAgIG5hbWU6ICdTZWl0YW4nXG4gIH0sIHtcbiAgICBib3VnaHQ6IGZhbHNlLFxuICAgIG5hbWU6ICdBbG1vbmQgTWVhbCBGbG91cidcbiAgfSwge1xuICAgIGJvdWdodDogZmFsc2UsXG4gICAgbmFtZTogJ09yZ2FuaWMgRWdncydcbiAgfV07IC8vPC9lZGl0b3ItZm9sZD5cbiAgLy88ZWRpdG9yLWZvbGQgZGVzYz0nU2xpZGUgVG9nZ2xlJz5cblxuICB0aGlzLnN5c3RlbXMgPSBbe1xuICAgIG5hbWU6ICdMaWdodHMnLFxuICAgIG9uOiBmYWxzZSxcbiAgICBjb2xvcjogJ3ByaW1hcnknXG4gIH0sIHtcbiAgICBuYW1lOiAnU3Vycm91bmQgU291bmQnLFxuICAgIG9uOiB0cnVlLFxuICAgIGNvbG9yOiAnYWNjZW50J1xuICB9LCB7XG4gICAgbmFtZTogJ1QuVi4nLFxuICAgIG9uOiB0cnVlLFxuICAgIGNvbG9yOiAnd2FybidcbiAgfV07XG4gIHRoaXMuaG91c2UgPSB7XG4gICAgbG9ja0hvdXNlOiBmYWxzZVxuICB9OyAvLzwvZWRpdG9yLWZvbGQ+XG59XG5cbkZkc0RlbW8ucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogRmRzRGVtbyxcbiAgLy88ZWRpdG9yLWZvbGQgZGVzYz0nQXV0b2NvbXBsZXRlJz5cbiAgZGlzcGxheUZuOiBmdW5jdGlvbiBkaXNwbGF5Rm4odmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgJiYgX3R5cGVvZih2YWx1ZSkgPT09ICdvYmplY3QnID8gdmFsdWUubmFtZSA6IHZhbHVlO1xuICB9LFxuICBmaWx0ZXJTdGF0ZXM6IGZ1bmN0aW9uIGZpbHRlclN0YXRlcyh2YWwpIHtcbiAgICByZXR1cm4gdmFsID8gdGhpcy5zdGF0ZXMuZmlsdGVyKGZ1bmN0aW9uIChzKSB7XG4gICAgICByZXR1cm4gcy5uYW1lLm1hdGNoKG5ldyBSZWdFeHAodmFsLCAnZ2knKSk7XG4gICAgfSkgOiB0aGlzLnN0YXRlcztcbiAgfSxcbiAgLy88L2VkaXRvci1mb2xkPlxuICAvLzxlZGl0b3ItZm9sZCBkZXNjPSdTbmFjayBCYXJzJz5cbiAgc2hvd1N1Y2Nlc3NTbmFja0JhcjogZnVuY3Rpb24gc2hvd1N1Y2Nlc3NTbmFja0JhcigpIHtcbiAgICB0aGlzLnNuYWNrQmFyU2VydmljZS5vcGVuQ29hc3Rlcih7XG4gICAgICB0aXRsZTogJ1N1Y2Nlc3MnLFxuICAgICAgbWVzc2FnZTogJ1NvbWUgaGVscCB0ZXh0IHJlZ2FyZGluZyB0aGUgc3VjY2Vzc2Z1bCBldmVudC4nLFxuICAgICAgdmVydGljYWxQb3NpdGlvbjogJ3RvcCcsXG4gICAgICBob3Jpem9udGFsUG9zaXRpb246ICdyaWdodCcsXG4gICAgICBpY29uOiAnZmEgZmEtY2hlY2stY2lyY2xlLW8nLFxuICAgICAgY29sb3I6ICcjMUVCNDc1JyxcbiAgICAgIGR1cmF0aW9uOiAzMDAwXG4gICAgfSk7XG4gIH0sXG4gIHNob3dXYXJuU25hY2tCYXI6IGZ1bmN0aW9uIHNob3dXYXJuU25hY2tCYXIoKSB7XG4gICAgdGhpcy5zbmFja0JhclNlcnZpY2Uub3BlbkNvYXN0ZXIoe1xuICAgICAgdGl0bGU6ICdXYXJuaW5nJyxcbiAgICAgIG1lc3NhZ2U6ICdTb21lIGhlbHAgdGV4dCByZWdhcmRpbmcgdGhlIHdhcm5pbmcuJyxcbiAgICAgIHZlcnRpY2FsUG9zaXRpb246ICd0b3AnLFxuICAgICAgaG9yaXpvbnRhbFBvc2l0aW9uOiAnbGVmdCcsXG4gICAgICBpY29uOiAnZmEgZmEtZXhjbGFtYXRpb24tdHJpYW5nbGUnLFxuICAgICAgY29sb3I6ICcjRTk4QTQwJyxcbiAgICAgIGR1cmF0aW9uOiAzMDAwXG4gICAgfSk7XG4gIH0sXG4gIHNob3dFcnJvclNuYWNrQmFyOiBmdW5jdGlvbiBzaG93RXJyb3JTbmFja0JhcigpIHtcbiAgICB0aGlzLnNuYWNrQmFyU2VydmljZS5vcGVuQ29hc3Rlcih7XG4gICAgICB0aXRsZTogJ0Vycm9yJyxcbiAgICAgIG1lc3NhZ2U6ICdTb21lIGhlbHAgdGV4dCByZWdhcmRpbmcgdGhlIGNyaXRpY2FsIGVycm9yLiBUaGlzIGNvYXN0ZXIgd2lsbCBzdGF5IG9wZW4gdW50aWwgY2xvc2VkIHdpdGggdGhlIGB4YCBvciBpZiBhbm90aGVyIGNvYXN0ZXIgaXMgY3JlYXRlZC4nLFxuICAgICAgdmVydGljYWxQb3NpdGlvbjogJ2JvdHRvbScsXG4gICAgICBob3Jpem9udGFsUG9zaXRpb246ICdyaWdodCcsXG4gICAgICBpY29uOiAnZmEgZmEtdGltZXMtY2lyY2xlLW8nLFxuICAgICAgY29sb3I6ICcjRUY2MTYyJ1xuICAgIH0pO1xuICB9LFxuICBzaG93UmVndWxhclNuYWNrQmFyOiBmdW5jdGlvbiBzaG93UmVndWxhclNuYWNrQmFyKCkge1xuICAgIHRoaXMuc25hY2tCYXJTZXJ2aWNlLm9wZW5Db2FzdGVyKHtcbiAgICAgIHRpdGxlOiAnUmVndWxhcicsXG4gICAgICBtZXNzYWdlOiAnU29tZXRoaW5nIGludGVyZXN0aW5nLicsXG4gICAgICB2ZXJ0aWNhbFBvc2l0aW9uOiAnYm90dG9tJyxcbiAgICAgIGhvcml6b250YWxQb3NpdGlvbjogJ2xlZnQnLFxuICAgICAgY29sb3I6ICcjODA4NzkzJyxcbiAgICAgIGR1cmF0aW9uOiAzMDAwXG4gICAgfSk7XG4gIH0sXG4gIC8vPC9lZGl0b3ItZm9sZD5cbiAgLy88ZWRpdG9yLWZvbGQgZGVzYz0nRGlhbG9nJz5cbiAgb3BlbkRpYWxvZzogZnVuY3Rpb24gb3BlbkRpYWxvZygpIHtcbiAgICB0aGlzLmRpYWxvZy5vcGVuKEZkc0RlbW9EaWFsb2cpO1xuICB9LFxuICAvLzwvZWRpdG9yLWZvbGQ+XG4gIC8vPGVkaXRvci1mb2xkIGRlc2M9J0V4cGFuc2lvbiBQYW5lbCc+XG4gIHRvZ2dsZUV4cGFuc2lvbjE6IGZ1bmN0aW9uIHRvZ2dsZUV4cGFuc2lvbjEoKSB7XG4gICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICB0aGlzLmV4cGFuc2lvbjEgPSAhdGhpcy5leHBhbnNpb24xO1xuICAgIH1cbiAgfSxcbiAgdG9nZ2xlRGlzYWJsZWQ6IGZ1bmN0aW9uIHRvZ2dsZURpc2FibGVkKCkge1xuICAgIHRoaXMuZGlzYWJsZWQgPSAhdGhpcy5kaXNhYmxlZDtcbiAgfSxcbiAgZXhwYW5kRXhwYW5zaW9uMUV2ZW50OiBmdW5jdGlvbiBleHBhbmRFeHBhbnNpb24xRXZlbnQoKSB7XG4gICAgdGhpcy5leHBhbmRDb2xsYXBzZUV4cGFuc2lvbjFNc2cgPSAnRXhwYW5kIGV2ZW50IGVtaXR0ZWQuJztcbiAgfSxcbiAgY29sbGFwc2VFeHBhbnNpb24xRXZlbnQ6IGZ1bmN0aW9uIGNvbGxhcHNlRXhwYW5zaW9uMUV2ZW50KCkge1xuICAgIHRoaXMuZXhwYW5kQ29sbGFwc2VFeHBhbnNpb24xTXNnID0gJ0NvbGxhcHNlIGV2ZW50IGVtaXR0ZWQuJztcbiAgfSxcbiAgLy88L2VkaXRvci1mb2xkPlxuICAvLzxlZGl0b3ItZm9sZCBkZXNjPSdTaW1wbGUgRGlhbG9ncyc+XG4gIG9wZW5BbGVydDogZnVuY3Rpb24gb3BlbkFsZXJ0KCkge1xuICAgIHRoaXMuZGlhbG9nU2VydmljZS5vcGVuQWxlcnQoe1xuICAgICAgdGl0bGU6ICdBbGVydCcsXG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWUsXG4gICAgICBtZXNzYWdlOiAnVGhpcyBpcyBob3cgc2ltcGxlIGl0IGlzIHRvIGNyZWF0ZSBhbiBhbGVydCB3aXRoIHRoaXMgd3JhcHBlciBzZXJ2aWNlLidcbiAgICB9KTtcbiAgfSxcbiAgb3BlbkNvbmZpcm06IGZ1bmN0aW9uIG9wZW5Db25maXJtKCkge1xuICAgIHRoaXMuZGlhbG9nU2VydmljZS5vcGVuQ29uZmlybSh7XG4gICAgICB0aXRsZTogJ0NvbmZpcm0nLFxuICAgICAgbWVzc2FnZTogJ1RoaXMgaXMgaG93IHNpbXBsZSBpdCBpcyB0byBjcmVhdGUgYSBjb25maXJtIHdpdGggdGhpcyB3cmFwcGVyIHNlcnZpY2UuIERvIHlvdSBhZ3JlZT8nLFxuICAgICAgY2FuY2VsQnV0dG9uOiAnRGlzYWdyZWUnLFxuICAgICAgYWNjZXB0QnV0dG9uOiAnQWdyZWUnXG4gICAgfSk7XG4gIH0sXG4gIG9wZW5Qcm9tcHQ6IGZ1bmN0aW9uIG9wZW5Qcm9tcHQoKSB7XG4gICAgdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW5Qcm9tcHQoe1xuICAgICAgdGl0bGU6ICdQcm9tcHQnLFxuICAgICAgbWVzc2FnZTogJ1RoaXMgaXMgaG93IHNpbXBsZSBpdCBpcyB0byBjcmVhdGUgYSBwcm9tcHQgd2l0aCB0aGlzIHdyYXBwZXIgc2VydmljZS4gUHJvbXB0IHNvbWV0aGluZy4nLFxuICAgICAgdmFsdWU6ICdQb3B1bGF0ZWQgdmFsdWUnLFxuICAgICAgY2FuY2VsQnV0dG9uOiAnQ2FuY2VsJyxcbiAgICAgIGFjY2VwdEJ1dHRvbjogJ09rJ1xuICAgIH0pO1xuICB9LFxuICAvLzwvZWRpdG9yLWZvbGQ+XG4gIC8vPGVkaXRvci1mb2xkIGRlc2M9J1NlYXJjaGFibGUgRXhwYW5zaW9uIFBhbmVscyc+XG4gIGlzRHJvcGxldEZpbHRlckNoZWNrZWQ6IGZ1bmN0aW9uIGlzRHJvcGxldEZpbHRlckNoZWNrZWQodGVybSkge1xuICAgIHJldHVybiB0aGlzLmRyb3BsZXRzU2VhcmNoVGVybXMuaW5kZXhPZih0ZXJtKSA+IC0xO1xuICB9LFxuICBnZXREcm9wbGV0VHlwZUNvdW50OiBmdW5jdGlvbiBnZXREcm9wbGV0VHlwZUNvdW50KHR5cGUpIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJlZERyb3BsZXRzLmZpbHRlcihmdW5jdGlvbiAoZHJvcGxldCkge1xuICAgICAgcmV0dXJuIGRyb3BsZXQudHlwZSA9PT0gdHlwZTtcbiAgICB9KS5sZW5ndGg7XG4gIH0sXG4gIGdldERyb3BsZXRDZXJ0aWZpY2F0aW9uQ291bnQ6IGZ1bmN0aW9uIGdldERyb3BsZXRDZXJ0aWZpY2F0aW9uQ291bnQoY2VydGlmaWNhdGlvbikge1xuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkRHJvcGxldHMuZmlsdGVyKGZ1bmN0aW9uIChkcm9wbGV0KSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmtleXMoZHJvcGxldCkuZmluZChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIGlmIChrZXkgPT09IGNlcnRpZmljYXRpb24gJiYgZHJvcGxldFtjZXJ0aWZpY2F0aW9uXS50eXBlID09PSAnY2VydGlmaWNhdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gZHJvcGxldDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSk7XG4gICAgfSkubGVuZ3RoO1xuICB9LFxuICBnZXRTb3J0Qnk6IGZ1bmN0aW9uIGdldFNvcnRCeSgpIHtcbiAgICB2YXIgc29ydEJ5Q29sdW1uTGFiZWw7XG4gICAgdmFyIGFycmF5TGVuZ3RoID0gdGhpcy5kcm9wbGV0Q29sdW1ucy5sZW5ndGg7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5TGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmRyb3BsZXRDb2x1bW5zW2ldLmFjdGl2ZSA9PT0gdHJ1ZSkge1xuICAgICAgICBzb3J0QnlDb2x1bW5MYWJlbCA9IHRoaXMuZHJvcGxldENvbHVtbnNbaV0ubGFiZWw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzb3J0QnlDb2x1bW5MYWJlbDtcbiAgfSxcbiAgc29ydERyb3BsZXRzOiBmdW5jdGlvbiBzb3J0RHJvcGxldHMoY29sdW1uKSB7XG4gICAgaWYgKGNvbHVtbi5zb3J0YWJsZSA9PT0gdHJ1ZSkge1xuICAgICAgLy8gdG9nZ2xlIGNvbHVtbiBzb3J0IG9yZGVyXG4gICAgICBjb2x1bW4uc29ydE9yZGVyID0gY29sdW1uLnNvcnRPcmRlciA9PT0gJ0FTQycgPyAnREVTQycgOiAnQVNDJztcbiAgICAgIHZhciBzb3J0T3JkZXIgPSBjb2x1bW4uc29ydE9yZGVyO1xuICAgICAgdGhpcy5maWx0ZXJEcm9wbGV0cyhjb2x1bW4ubmFtZSwgc29ydE9yZGVyKTsgLy9vbmx5IG9uZSBjb2x1bW4gY2FuIGJlIGFjdGl2ZWx5IHNvcnRlZCBzbyB3ZSByZXNldCBhbGwgdG8gaW5hY3RpdmVcblxuICAgICAgdGhpcy5kcm9wbGV0Q29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7XG4gICAgICAgIGMuYWN0aXZlID0gZmFsc2U7XG4gICAgICB9KTsgLy9hbmQgc2V0IHRoaXMgY29sdW1uIGFzIHRoZSBhY3RpdmVseSBzb3J0ZWQgY29sdW1uXG5cbiAgICAgIGNvbHVtbi5hY3RpdmUgPSB0cnVlO1xuICAgICAgdGhpcy5hY3RpdmVEcm9wbGV0Q29sdW1uID0gY29sdW1uO1xuICAgIH1cbiAgfSxcbiAgdG9nZ2xlRHJvcGxldHNGaWx0ZXI6IGZ1bmN0aW9uIHRvZ2dsZURyb3BsZXRzRmlsdGVyKHNlYXJjaFRlcm0pIHtcbiAgICB2YXIgYXBwbHlTZWFyY2hUZXJtID0gdHJ1ZTsgLy8gY2hlY2sgaWYgdGhlIHNlYXJjaCB0ZXJtIGlzIGFscmVhZHkgYXBwbGllZCBhbmQgcmVtb3ZlIGl0IGlmIHRydWVcblxuICAgIGlmICh0aGlzLmRyb3BsZXRzU2VhcmNoVGVybXMubGVuZ3RoID4gMCkge1xuICAgICAgdmFyIGFycmF5TGVuZ3RoID0gdGhpcy5kcm9wbGV0c1NlYXJjaFRlcm1zLmxlbmd0aDtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheUxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBpbmRleCA9IHRoaXMuZHJvcGxldHNTZWFyY2hUZXJtcy5pbmRleE9mKHNlYXJjaFRlcm0pO1xuXG4gICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgdGhpcy5kcm9wbGV0c1NlYXJjaFRlcm1zLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgYXBwbHlTZWFyY2hUZXJtID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIGlmIHdlIGp1c3QgcmVtb3ZlZCB0aGUgc2VhcmNoIHRlcm0gZG8gTk9UIGFwcGx5IGl0IGFnYWluXG5cblxuICAgIGlmIChhcHBseVNlYXJjaFRlcm0pIHtcbiAgICAgIHRoaXMuZHJvcGxldHNTZWFyY2hUZXJtcy5wdXNoKHNlYXJjaFRlcm0pO1xuICAgIH1cblxuICAgIHRoaXMuZmlsdGVyRHJvcGxldHModGhpcy5hY3RpdmVEcm9wbGV0Q29sdW1uLm5hbWUsIHRoaXMuYWN0aXZlRHJvcGxldENvbHVtbi5zb3J0T3JkZXIpO1xuICB9LFxuICBmaWx0ZXJEcm9wbGV0czogZnVuY3Rpb24gZmlsdGVyRHJvcGxldHMoc29ydEJ5LCBzb3J0T3JkZXIpIHtcbiAgICAvLyBpZiBgc29ydE9yZGVyYCBpcyBgdW5kZWZpbmVkYCB0aGVuIHVzZSAnQVNDJ1xuICAgIGlmIChzb3J0T3JkZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgc29ydE9yZGVyID0gJ0FTQyc7XG4gICAgfSAvLyBpZiBgc29ydEJ5YCBpcyBgdW5kZWZpbmVkYCB0aGVuIGZpbmQgdGhlIGZpcnN0IHNvcnRhYmxlIGNvbHVtbiBpbiB0aGlzLmRyb3BsZXRDb2x1bW5zXG5cblxuICAgIGlmIChzb3J0QnkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIGFycmF5TGVuZ3RoID0gdGhpcy5kcm9wbGV0Q29sdW1ucy5sZW5ndGg7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXlMZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAodGhpcy5kcm9wbGV0Q29sdW1uc1tpXS5zb3J0YWJsZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHNvcnRCeSA9IHRoaXMuZHJvcGxldENvbHVtbnNbaV0ubmFtZTtcbiAgICAgICAgICB0aGlzLmFjdGl2ZURyb3BsZXRDb2x1bW4gPSB0aGlzLmRyb3BsZXRDb2x1bW5zW2ldOyAvL29ubHkgb25lIGNvbHVtbiBjYW4gYmUgYWN0aXZlbHkgc29ydGVkIHNvIHdlIHJlc2V0IGFsbCB0byBpbmFjdGl2ZVxuXG4gICAgICAgICAgdGhpcy5kcm9wbGV0Q29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7XG4gICAgICAgICAgICBjLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgIH0pOyAvL2FuZCBzZXQgdGhpcyBjb2x1bW4gYXMgdGhlIGFjdGl2ZWx5IHNvcnRlZCBjb2x1bW5cblxuICAgICAgICAgIHRoaXMuZHJvcGxldENvbHVtbnNbaV0uYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLmRyb3BsZXRDb2x1bW5zW2ldLnNvcnRPcmRlciA9IHNvcnRPcmRlcjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBuZXdEYXRhID0gdGhpcy5kcm9wbGV0cztcblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCB0aGlzLmRyb3BsZXRzU2VhcmNoVGVybXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICBuZXdEYXRhID0gdGhpcy5maWx0ZXJEYXRhKG5ld0RhdGEsIHRoaXMuZHJvcGxldHNTZWFyY2hUZXJtc1tfaV0sIHRydWUsIHRoaXMuYWN0aXZlRHJvcGxldENvbHVtbi5uYW1lKTtcbiAgICB9XG5cbiAgICBuZXdEYXRhID0gdGhpcy5kYXRhVGFibGVTZXJ2aWNlLnNvcnREYXRhKG5ld0RhdGEsIHNvcnRCeSwgc29ydE9yZGVyKTtcbiAgICB0aGlzLmZpbHRlcmVkRHJvcGxldHMgPSBuZXdEYXRhO1xuICAgIHRoaXMuZ2V0QXV0b0NvbXBsZXRlRHJvcGxldHMoKTtcbiAgfSxcbiAgZ2V0QXV0b0NvbXBsZXRlRHJvcGxldHM6IGZ1bmN0aW9uIGdldEF1dG9Db21wbGV0ZURyb3BsZXRzKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmF1dG9Db21wbGV0ZURyb3BsZXRzID0gW107XG4gICAgdGhpcy5kcm9wbGV0Q29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7XG4gICAgICBzZWxmLmZpbHRlcmVkRHJvcGxldHMuZm9yRWFjaChmdW5jdGlvbiAocikge1xuICAgICAgICByZXR1cm4gcltjLm5hbWUudG9Mb3dlckNhc2UoKV0gPyBzZWxmLmF1dG9Db21wbGV0ZURyb3BsZXRzLnB1c2gocltjLm5hbWUudG9Mb3dlckNhc2UoKV0udG9TdHJpbmcoKSkgOiAnJztcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9LFxuICAvLzwvZWRpdG9yLWZvbGQ+XG4gIGZpbHRlckRhdGE6IGZ1bmN0aW9uIGZpbHRlckRhdGEoZGF0YSwgc2VhcmNoVGVybSwgaWdub3JlQ2FzZSkge1xuICAgIHZhciBmaWVsZCA9ICcnO1xuXG4gICAgaWYgKHNlYXJjaFRlcm0uaW5kZXhPZignOicpID4gLTEpIHtcbiAgICAgIGZpZWxkID0gc2VhcmNoVGVybS5zcGxpdCgnOicpWzBdLnRyaW0oKTtcbiAgICAgIHNlYXJjaFRlcm0gPSBzZWFyY2hUZXJtLnNwbGl0KCc6JylbMV0udHJpbSgpO1xuICAgIH1cblxuICAgIHZhciBmaWx0ZXIgPSBzZWFyY2hUZXJtID8gaWdub3JlQ2FzZSA/IHNlYXJjaFRlcm0udG9Mb3dlckNhc2UoKSA6IHNlYXJjaFRlcm0gOiAnJztcblxuICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgIGRhdGEgPSBkYXRhLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICB2YXIgcmVzID0gT2JqZWN0LmtleXMoaXRlbSkuZmluZChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgaWYgKGZpZWxkLmluZGV4T2YoJy4nKSA+IC0xKSB7XG4gICAgICAgICAgICB2YXIgb2JqQXJyYXkgPSBmaWVsZC5zcGxpdCgnLicpO1xuICAgICAgICAgICAgdmFyIG9iaiA9IGl0ZW07XG4gICAgICAgICAgICB2YXIgYXJyYXlMZW5ndGggPSBvYmpBcnJheS5sZW5ndGg7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXlMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIG9iaiA9IG9ialtvYmpBcnJheVtpXV07XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIF9wcmVJdGVtVmFsdWUgPSAnJyArIG9iajtcblxuICAgICAgICAgICAgdmFyIF9pdGVtVmFsdWUgPSBpZ25vcmVDYXNlID8gX3ByZUl0ZW1WYWx1ZS50b0xvd2VyQ2FzZSgpIDogX3ByZUl0ZW1WYWx1ZTtcblxuICAgICAgICAgICAgcmV0dXJuIF9pdGVtVmFsdWUuaW5kZXhPZihmaWx0ZXIpID4gLTE7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGtleSAhPT0gZmllbGQgJiYgZmllbGQgIT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIHByZUl0ZW1WYWx1ZSA9ICcnICsgaXRlbVtrZXldO1xuICAgICAgICAgIHZhciBpdGVtVmFsdWUgPSBpZ25vcmVDYXNlID8gcHJlSXRlbVZhbHVlLnRvTG93ZXJDYXNlKCkgOiBwcmVJdGVtVmFsdWU7XG4gICAgICAgICAgcmV0dXJuIGl0ZW1WYWx1ZS5pbmRleE9mKGZpbHRlcikgPiAtMTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiAhKHR5cGVvZiByZXMgPT09ICd1bmRlZmluZWQnKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBkYXRhO1xuICB9LFxuICAvLzxlZGl0b3ItZm9sZCBkZXNjPSdEYXRhIFRhYmxlcyc+XG4gIHNvcnQ6IGZ1bmN0aW9uIHNvcnQoc29ydEV2ZW50LCBjb2x1bW4pIHtcbiAgICBpZiAoY29sdW1uLnNvcnRhYmxlKSB7XG4gICAgICB2YXIgc29ydEJ5ID0gY29sdW1uLm5hbWU7XG4gICAgICBjb2x1bW4uc29ydE9yZGVyID0gY29sdW1uLnNvcnRPcmRlciA9PT0gJ0FTQycgPyAnREVTQycgOiAnQVNDJztcbiAgICAgIHZhciBzb3J0T3JkZXIgPSBjb2x1bW4uc29ydE9yZGVyO1xuICAgICAgdGhpcy5maWx0ZXIoc29ydEJ5LCBzb3J0T3JkZXIpOyAvL29ubHkgb25lIGNvbHVtbiBjYW4gYmUgYWN0aXZlbHkgc29ydGVkIHNvIHdlIHJlc2V0IGFsbCB0byBpbmFjdGl2ZVxuXG4gICAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoYykge1xuICAgICAgICBjLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgfSk7IC8vYW5kIHNldCB0aGlzIGNvbHVtbiBhcyB0aGUgYWN0aXZlbHkgc29ydGVkIGNvbHVtblxuXG4gICAgICBjb2x1bW4uYWN0aXZlID0gdHJ1ZTtcbiAgICB9XG4gIH0sXG4gIHNlYXJjaFJlbW92ZTogZnVuY3Rpb24gc2VhcmNoUmVtb3ZlKHNlYXJjaFRlcm0pIHtcbiAgICAvL29ubHkgcmVtb3ZlIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZSBzZWFyY2ggdGVybVxuICAgIHZhciBpbmRleCA9IHRoaXMuc2VhcmNoVGVybS5pbmRleE9mKHNlYXJjaFRlcm0pO1xuXG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5zZWFyY2hUZXJtLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuXG4gICAgdGhpcy5mcm9tUm93ID0gMTtcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcbiAgICB0aGlzLmZpbHRlcigpO1xuICB9LFxuICBzZWFyY2hBZGQ6IGZ1bmN0aW9uIHNlYXJjaEFkZChzZWFyY2hUZXJtKSB7XG4gICAgdGhpcy5zZWFyY2hUZXJtLnB1c2goc2VhcmNoVGVybSk7XG4gICAgdGhpcy5mcm9tUm93ID0gMTtcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcbiAgICB0aGlzLmZpbHRlcigpO1xuICB9LFxuICBwYWdlOiBmdW5jdGlvbiBwYWdlKHBhZ2luZ0V2ZW50KSB7XG4gICAgdGhpcy5mcm9tUm93ID0gcGFnaW5nRXZlbnQuZnJvbVJvdztcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gcGFnaW5nRXZlbnQucGFnZTtcbiAgICB0aGlzLnBhZ2VTaXplID0gcGFnaW5nRXZlbnQucGFnZVNpemU7XG4gICAgdGhpcy5hbGxSb3dzU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmZpbHRlcigpO1xuICB9LFxuICBmaWx0ZXI6IGZ1bmN0aW9uIGZpbHRlcihzb3J0QnksIHNvcnRPcmRlcikge1xuICAgIGlmICh0aGlzLmFsbFJvd3NTZWxlY3RlZCkge1xuICAgICAgdGhpcy50b2dnbGVTZWxlY3RBbGwoKTtcbiAgICB9XG5cbiAgICB0aGlzLmRlc2VsZWN0QWxsKCk7XG4gICAgdmFyIG5ld0RhdGEgPSB0aGlzLmRhdGE7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc2VhcmNoVGVybS5sZW5ndGg7IGkrKykge1xuICAgICAgbmV3RGF0YSA9IHRoaXMuZmlsdGVyRGF0YShuZXdEYXRhLCB0aGlzLnNlYXJjaFRlcm1baV0sIHRydWUpO1xuICAgIH1cblxuICAgIHRoaXMuZmlsdGVyZWRUb3RhbCA9IG5ld0RhdGEubGVuZ3RoO1xuICAgIG5ld0RhdGEgPSB0aGlzLmRhdGFUYWJsZVNlcnZpY2Uuc29ydERhdGEobmV3RGF0YSwgc29ydEJ5LCBzb3J0T3JkZXIpO1xuICAgIHRoaXMucGFnZUNvdW50ID0gbmV3RGF0YS5sZW5ndGg7XG4gICAgbmV3RGF0YSA9IHRoaXMuZGF0YVRhYmxlU2VydmljZS5wYWdlRGF0YShuZXdEYXRhLCB0aGlzLmZyb21Sb3csIHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnBhZ2VTaXplKTtcbiAgICB0aGlzLmZpbHRlcmVkRGF0YSA9IG5ld0RhdGE7XG4gICAgdGhpcy5nZXRBdXRvQ29tcGxldGVEYXRhKCk7XG4gIH0sXG4gIHRvZ2dsZVNlbGVjdDogZnVuY3Rpb24gdG9nZ2xlU2VsZWN0KHJvdykge1xuICAgIGlmICh0aGlzLmFsbEZpbHRlcmVkUm93c1NlbGVjdGVkKCkpIHtcbiAgICAgIHRoaXMuYWxsUm93c1NlbGVjdGVkID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hbGxSb3dzU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICB9XG4gIH0sXG4gIHRvZ2dsZVNlbGVjdEFsbDogZnVuY3Rpb24gdG9nZ2xlU2VsZWN0QWxsKCkge1xuICAgIGlmICh0aGlzLmFsbFJvd3NTZWxlY3RlZCkge1xuICAgICAgdGhpcy5zZWxlY3RBbGwoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kZXNlbGVjdEFsbCgpO1xuICAgIH1cbiAgfSxcbiAgc2VsZWN0QWxsOiBmdW5jdGlvbiBzZWxlY3RBbGwoKSB7XG4gICAgdGhpcy5maWx0ZXJlZERhdGEuZm9yRWFjaChmdW5jdGlvbiAoYykge1xuICAgICAgYy5jaGVja2VkID0gdHJ1ZTtcbiAgICB9KTtcbiAgfSxcbiAgZGVzZWxlY3RBbGw6IGZ1bmN0aW9uIGRlc2VsZWN0QWxsKCkge1xuICAgIHRoaXMuZmlsdGVyZWREYXRhLmZvckVhY2goZnVuY3Rpb24gKGMpIHtcbiAgICAgIGMuY2hlY2tlZCA9IGZhbHNlO1xuICAgIH0pO1xuICB9LFxuICBhbGxGaWx0ZXJlZFJvd3NTZWxlY3RlZDogZnVuY3Rpb24gYWxsRmlsdGVyZWRSb3dzU2VsZWN0ZWQoKSB7XG4gICAgdmFyIGFsbEZpbHRlcmVkUm93c1NlbGVjdGVkID0gdHJ1ZTtcbiAgICB0aGlzLmZpbHRlcmVkRGF0YS5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7XG4gICAgICBpZiAoYy5jaGVja2VkID09PSB1bmRlZmluZWQgfHwgYy5jaGVja2VkID09PSBmYWxzZSkge1xuICAgICAgICBhbGxGaWx0ZXJlZFJvd3NTZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBhbGxGaWx0ZXJlZFJvd3NTZWxlY3RlZDtcbiAgfSxcbiAgYXJlVG9vbHRpcHNPbjogZnVuY3Rpb24gYXJlVG9vbHRpcHNPbigpIHtcbiAgICByZXR1cm4gdGhpcy5jb2x1bW5zWzBdLmhhc093blByb3BlcnR5KCd0b29sdGlwJyk7XG4gIH0sXG4gIHRvZ2dsZVRvb2x0aXBzOiBmdW5jdGlvbiB0b2dnbGVUb29sdGlwcygpIHtcbiAgICBpZiAodGhpcy5jb2x1bW5zWzBdLnRvb2x0aXApIHtcbiAgICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7XG4gICAgICAgIGRlbGV0ZSBjLnRvb2x0aXA7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgYy50b29sdGlwID0gJ1RoaXMgaXMgJyArIGMubGFiZWwgKyAnISc7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG4gIG9wZW5EYXRhVGFibGVQcm9tcHQ6IGZ1bmN0aW9uIG9wZW5EYXRhVGFibGVQcm9tcHQocm93LCBuYW1lKSB7XG4gICAgdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW5Qcm9tcHQoe1xuICAgICAgbWVzc2FnZTogJ0VudGVyIGNvbW1lbnQ/JyxcbiAgICAgIHZhbHVlOiByb3dbbmFtZV1cbiAgICB9KS5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJvd1tuYW1lXSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0pO1xuICB9LFxuICBnZXRBdXRvQ29tcGxldGVEYXRhOiBmdW5jdGlvbiBnZXRBdXRvQ29tcGxldGVEYXRhKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmF1dG9Db21wbGV0ZURhdGEgPSBbXTtcbiAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoYykge1xuICAgICAgc2VsZi5maWx0ZXJlZERhdGEuZm9yRWFjaChmdW5jdGlvbiAocikge1xuICAgICAgICByZXR1cm4gcltjLm5hbWUudG9Mb3dlckNhc2UoKV0gPyBzZWxmLmF1dG9Db21wbGV0ZURhdGEucHVzaChyW2MubmFtZS50b0xvd2VyQ2FzZSgpXS50b1N0cmluZygpKSA6ICcnO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0sXG4gIC8vPC9lZGl0b3ItZm9sZD5cbiAgLy88ZWRpdG9yLWZvbGQgZGVzYz0nQ2hpcHMgJCBBdXRvY29tcGxldGUnPlxuICB0b2dnbGVSZWFkT25seTogZnVuY3Rpb24gdG9nZ2xlUmVhZE9ubHkoKSB7XG4gICAgdGhpcy5yZWFkT25seSA9ICF0aGlzLnJlYWRPbmx5O1xuICB9LFxuICAvLzwvZWRpdG9yLWZvbGQ+XG4gIC8vPGVkaXRvci1mb2xkIGRlc2M9J0xpZmUgQ3ljbGUgTGlzdGVuZXJzJz5cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgY29tcG9uZW50XG4gICAqL1xuICBuZ09uSW5pdDogZnVuY3Rpb24gbmdPbkluaXQoKSB7XG4gICAgdGhpcy5maWx0ZXIoKTtcbiAgICB0aGlzLmZpbHRlckRyb3BsZXRzKCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJlc3BvbmQgYWZ0ZXIgQW5ndWxhciBjaGVja3MgdGhlIGNvbXBvbmVudCdzIHZpZXdzIGFuZCBjaGlsZCB2aWV3c1xuICAgKi9cbiAgbmdBZnRlclZpZXdDaGVja2VkOiBmdW5jdGlvbiBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7XG4gICAgdGhpcy5mZHNTZXJ2aWNlLmluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgfSAvLzwvZWRpdG9yLWZvbGQ+XG5cbn07XG5GZHNEZW1vLmFubm90YXRpb25zID0gW25ldyBDb21wb25lbnQoe1xuICB0ZW1wbGF0ZTogcmVxdWlyZSgnLi9mZHMtZGVtby5odG1sJyksXG4gIGFuaW1hdGlvbnM6IFtGZHNBbmltYXRpb25zLnNsaWRlSW5MZWZ0QW5pbWF0aW9uXSxcbiAgaG9zdDoge1xuICAgICdbQHJvdXRlQW5pbWF0aW9uXSc6ICdyb3V0ZUFuaW1hdGlvbidcbiAgfVxufSldO1xuRmRzRGVtby5wYXJhbWV0ZXJzID0gW0Zkc1NuYWNrQmFyU2VydmljZSwgRmRzU2VydmljZSwgTWF0RGlhbG9nLCBUZERhdGFUYWJsZVNlcnZpY2UsIEZkc0RpYWxvZ1NlcnZpY2VdO1xuZXhwb3J0IGRlZmF1bHQgRmRzRGVtbzsiLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlXG4gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGhcbiAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5cbiAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wXG4gKiAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoXG4gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgJ2NvcmUtanMnO1xuaW1wb3J0ICd6b25lLmpzJztcbmltcG9ydCAnaGFtbWVyanMnO1xuaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCB7IHBsYXRmb3JtQnJvd3NlckR5bmFtaWMgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyLWR5bmFtaWMnO1xuaW1wb3J0IHsgZW5hYmxlUHJvZE1vZGUsIFRSQU5TTEFUSU9OUywgVFJBTlNMQVRJT05TX0ZPUk1BVCwgTE9DQUxFX0lEIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgRmRzTW9kdWxlIGZyb20gJ3dlYmFwcC9mZHMubW9kdWxlLmpzJzsgLy8gQ29tbWVudCBvdXQgdGhpcyBsaW5lIHdoZW4gZGV2ZWxvcGluZyB0byBhc3NlcnQgZm9yIHVuaWRpcmVjdGlvbmFsIGRhdGEgZmxvd1xuXG5lbmFibGVQcm9kTW9kZSgpOyAvLyBHZXQgdGhlIGxvY2FsZSBpZCBmcm9tIHRoZSBnbG9iYWxcblxudmFyIGxvY2FsZSA9IG5hdmlnYXRvci5sYW5ndWFnZTtcbnZhciBwcm92aWRlcnMgPSBbXTsgLy8gTm8gbG9jYWxlIG9yIFUuUy4gRW5nbGlzaDogbm8gdHJhbnNsYXRpb24gcHJvdmlkZXJzIHNvIGdvIGFoZWFkIGFuZCBib290c3RyYXAgdGhlIGFwcFxuXG5pZiAoIWxvY2FsZSB8fCBsb2NhbGUgPT09ICdlbi1VUycpIHtcbiAgcGxhdGZvcm1Ccm93c2VyRHluYW1pYygpLmJvb3RzdHJhcE1vZHVsZShGZHNNb2R1bGUsIHtcbiAgICBwcm92aWRlcnM6IHByb3ZpZGVyc1xuICB9KTtcbn0gZWxzZSB7XG4gIC8vbG9hZCB0aGUgdHJhbnNsYXRpb24gcHJvdmlkZXJzIGFuZCBib290c3RyYXAgdGhlIG1vZHVsZVxuICB2YXIgdHJhbnNsYXRpb25GaWxlID0gJy9sb2NhbGUvbWVzc2FnZXMuJyArIGxvY2FsZSArICcueGxmJztcbiAgJC5hamF4KHtcbiAgICB1cmw6IHRyYW5zbGF0aW9uRmlsZVxuICB9KS5kb25lKGZ1bmN0aW9uICh0cmFuc2xhdGlvbnMpIHtcbiAgICAvLyBhZGQgcHJvdmlkZXJzIGlmIHRyYW5zbGF0aW9uIGZpbGUgZm9yIGxvY2FsZSBpcyBsb2FkZWRcbiAgICBpZiAodHJhbnNsYXRpb25zKSB7XG4gICAgICBwcm92aWRlcnMucHVzaCh7XG4gICAgICAgIHByb3ZpZGU6IFRSQU5TTEFUSU9OUyxcbiAgICAgICAgdXNlVmFsdWU6IHRyYW5zbGF0aW9uc1xuICAgICAgfSk7XG4gICAgICBwcm92aWRlcnMucHVzaCh7XG4gICAgICAgIHByb3ZpZGU6IFRSQU5TTEFUSU9OU19GT1JNQVQsXG4gICAgICAgIHVzZVZhbHVlOiAneGxmJ1xuICAgICAgfSk7XG4gICAgICBwcm92aWRlcnMucHVzaCh7XG4gICAgICAgIHByb3ZpZGU6IExPQ0FMRV9JRCxcbiAgICAgICAgdXNlVmFsdWU6IGxvY2FsZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcGxhdGZvcm1Ccm93c2VyRHluYW1pYygpLmJvb3RzdHJhcE1vZHVsZShGZHNNb2R1bGUsIHtcbiAgICAgIHByb3ZpZGVyczogcHJvdmlkZXJzXG4gICAgfSk7XG4gIH0pLmZhaWwoZnVuY3Rpb24gKCkge1xuICAgIHBsYXRmb3JtQnJvd3NlckR5bmFtaWMoKS5ib290c3RyYXBNb2R1bGUoRmRzTW9kdWxlLCB7XG4gICAgICBwcm92aWRlcnM6IHByb3ZpZGVyc1xuICAgIH0pO1xuICB9KTtcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IFwiPCEtLVxcbkxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZVxcbmNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aFxcbnRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5cXG5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMFxcbih0aGUgXFxcIkxpY2Vuc2VcXFwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoXFxudGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcXG5cXG5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcXG5cXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXFxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXFxcIkFTIElTXFxcIiBCQVNJUyxcXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXFxuLS0+XFxuXFxuPG1hdC1wcm9ncmVzcy1zcGlubmVyIGlkPVxcXCJsb2FkaW5nLXNwaW5uZXJcXFwiICpuZ0lmPVxcXCJmZHNTZXJ2aWNlLmluUHJvZ3Jlc3NcXFwiIG1vZGU9XFxcImluZGV0ZXJtaW5hdGVcXFwiPjwvbWF0LXByb2dyZXNzLXNwaW5uZXI+XFxuPG1hdC1zaWRlbmF2LWNvbnRhaW5lcj5cXG4gICAgPG1hdC1zaWRlbmF2ICNzaWRlbmF2IG1vZGU9XFxcIm92ZXJcXFwiIGFsaWduPVxcXCJlbmRcXFwiIG9wZW5lZD1cXFwiZmFsc2VcXFwiIGRpc2FibGVDbG9zZT1cXFwidHJ1ZVxcXCI+XFxuICAgICAgICA8cm91dGVyLW91dGxldCBuYW1lPVxcXCJzaWRlbmF2XFxcIj48L3JvdXRlci1vdXRsZXQ+XFxuICAgIDwvbWF0LXNpZGVuYXY+XFxuICAgIDxkaXYgaWQ9XFxcImZkcy1hcHAtY29udGFpbmVyXFxcIj5cXG4gICAgICAgIDxtYXQtdG9vbGJhciBpZD1cXFwiZmRzLXRvb2xiYXJcXFwiPlxcbiAgICAgICAgICAgIDwhLS0gPGltZyBpZD1cXFwiZmRzLWxvZ29cXFwiIHNyYz1cXFwiZmRzL2ltYWdlcy9mZHMtbG9nby13ZWItYXBwLnN2Z1xcXCI+IC0tPlxcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XFxcImZkc1NlcnZpY2UucGVyc3BlY3RpdmUgIT09ICdsb2dpbicgJiYgZmRzU2VydmljZS5wZXJzcGVjdGl2ZSAhPT0gJ25vdC1mb3VuZCdcXFwiIGZ4RmxleD1cXFwiMSAxIGF1dG9cXFwiIGNsYXNzPVxcXCJwYWQtbGVmdC14bFxcXCIgW0BmbHlJbk91dF09XFxcImZkc1NlcnZpY2UuYnJlYWRDcnVtYlN0YXRlXFxcIj5cXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcInBvaW50ZXJcXFwiPnt7ZmRzU2VydmljZS50aXRsZX19PC9zcGFuPlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9tYXQtdG9vbGJhcj5cXG4gICAgICAgIDxkaXYgaWQ9XFxcImZkcy1wZXJzcGVjdGl2ZXMtY29udGFpbmVyXFxcIj5cXG4gICAgICAgICAgICA8cm91dGVyLW91dGxldD48L3JvdXRlci1vdXRsZXQ+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgPC9kaXY+XFxuPC9tYXQtc2lkZW5hdi1jb250YWluZXI+XFxuXCI7IiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZVxuICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoXG4gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuXG4gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMFxuICogKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aFxuICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgQ29tcG9uZW50LCBWaWV3Q2hpbGQsIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgRmRzU2VydmljZSBmcm9tICd3ZWJhcHAvc2VydmljZXMvZmRzLnNlcnZpY2UuanMnO1xuaW1wb3J0IHsgRmRzQW5pbWF0aW9ucyB9IGZyb20gJ0BuaWZpLWZkcy9jb3JlJztcbi8qKlxuICogRmRzIGNvbnN0cnVjdG9yLlxuICpcbiAqIEBwYXJhbSBmZHNTZXJ2aWNlICAgICAgICAgICAgVGhlIGZkcyBzZXJ2aWNlLlxuICogQHBhcmFtIGNoYW5nZURldGVjdG9yUmVmICAgICBUaGUgY2hhbmdlIGRldGVjdG9yIHJlZi5cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5cbmZ1bmN0aW9uIEZkcyhmZHNTZXJ2aWNlLCBjaGFuZ2VEZXRlY3RvclJlZikge1xuICB0aGlzLmZkc1NlcnZpY2UgPSBmZHNTZXJ2aWNlO1xuICB0aGlzLmNkID0gY2hhbmdlRGV0ZWN0b3JSZWY7XG59XG5cbkZkcy5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBGZHMsXG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIGNvbXBvbmVudFxuICAgKi9cbiAgbmdPbkluaXQ6IGZ1bmN0aW9uIG5nT25Jbml0KCkge1xuICAgIHRoaXMuZmRzU2VydmljZS5zaWRlbmF2ID0gdGhpcy5zaWRlbmF2OyAvL25nQ29yZS5WaWV3Q2hpbGRcbiAgfSxcblxuICAvKipcbiAgICogU2luY2UgdGhlIGNoaWxkIHZpZXdzIGFyZSB1cGRhdGluZyB0aGUgZmRzU2VydmljZSB2YWx1ZXMgdGhhdCBhcmUgdXNlZCB0byBkaXNwbGF5XG4gICAqIHRoZSBicmVhZGNydW1icyBpbiB0aGlzIGNvbXBvbmVudCdzIHZpZXcgd2UgbmVlZCB0byBtYW51YWxseSBkZXRlY3QgY2hhbmdlcyBhdCB0aGUgY29ycmVjdFxuICAgKiBwb2ludCBpbiB0aGUgbGlmZWN5Y2xlLlxuICAgKi9cbiAgbmdBZnRlclZpZXdDaGVja2VkOiBmdW5jdGlvbiBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7XG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cbn07XG5GZHMuYW5ub3RhdGlvbnMgPSBbbmV3IENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZmRzLWFwcCcsXG4gIHRlbXBsYXRlOiByZXF1aXJlKCcuL2Zkcy5odG1sJyksXG4gIHF1ZXJpZXM6IHtcbiAgICBzaWRlbmF2OiBuZXcgVmlld0NoaWxkKCdzaWRlbmF2JylcbiAgfSxcbiAgYW5pbWF0aW9uczogW0Zkc0FuaW1hdGlvbnMuZmx5SW5PdXRBbmltYXRpb25dXG59KV07XG5GZHMucGFyYW1ldGVycyA9IFtGZHNTZXJ2aWNlLCBDaGFuZ2VEZXRlY3RvclJlZl07XG5leHBvcnQgZGVmYXVsdCBGZHM7IiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZVxuICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoXG4gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuXG4gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMFxuICogKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aFxuICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZkc0NvcmVNb2R1bGUgfSBmcm9tICdAbmlmaS1mZHMvY29yZSc7XG5pbXBvcnQgRmRzUm91dGVzIGZyb20gJ3dlYmFwcC9mZHMucm91dGVzLmpzJztcbmltcG9ydCBGZHMgZnJvbSAnd2ViYXBwL2Zkcy5qcyc7XG5pbXBvcnQgRmRzRGVtbyBmcm9tICd3ZWJhcHAvY29tcG9uZW50cy9mbG93LWRlc2lnbi1zeXN0ZW0vZmRzLWRlbW8uanMnO1xuaW1wb3J0IEZkc0RlbW9EaWFsb2cgZnJvbSAnd2ViYXBwL2NvbXBvbmVudHMvZmxvdy1kZXNpZ24tc3lzdGVtL2RpYWxvZ3MvZGVtby9mZHMtZGVtby1kaWFsb2cuanMnO1xuaW1wb3J0IEZkc1NlcnZpY2UgZnJvbSAnd2ViYXBwL3NlcnZpY2VzL2Zkcy5zZXJ2aWNlLmpzJztcblxuZnVuY3Rpb24gRmRzTW9kdWxlKCkge31cblxuRmRzTW9kdWxlLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IEZkc01vZHVsZVxufTtcbkZkc01vZHVsZS5hbm5vdGF0aW9ucyA9IFtuZXcgTmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbRmRzQ29yZU1vZHVsZSwgRmRzUm91dGVzXSxcbiAgZGVjbGFyYXRpb25zOiBbRmRzLCBGZHNEZW1vLCBGZHNEZW1vRGlhbG9nXSxcbiAgZW50cnlDb21wb25lbnRzOiBbRmRzRGVtb0RpYWxvZ10sXG4gIHByb3ZpZGVyczogW0Zkc1NlcnZpY2VdLFxuICBib290c3RyYXA6IFtGZHNdXG59KV07XG5leHBvcnQgZGVmYXVsdCBGZHNNb2R1bGU7IiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZVxuICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoXG4gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuXG4gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMFxuICogKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aFxuICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgUm91dGVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCBGZHNEZW1vIGZyb20gJ3dlYmFwcC9jb21wb25lbnRzL2Zsb3ctZGVzaWduLXN5c3RlbS9mZHMtZGVtby5qcyc7XG52YXIgRmRzUm91dGVzID0gUm91dGVyTW9kdWxlLmZvclJvb3QoW3tcbiAgcGF0aDogJycsXG4gIGNvbXBvbmVudDogRmRzRGVtb1xufV0pO1xuZXhwb3J0IGRlZmF1bHQgRmRzUm91dGVzOyIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmVcbiAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aFxuICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlxuICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjBcbiAqICh0aGUgJ0xpY2Vuc2UnKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoXG4gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAnQVMgSVMnIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgVGREYXRhVGFibGVTZXJ2aWNlIH0gZnJvbSAnQGNvdmFsZW50L2NvcmUvZGF0YS10YWJsZSc7XG5pbXBvcnQgeyBGZHNEaWFsb2dTZXJ2aWNlLCBGZHNTbmFja0JhclNlcnZpY2UgfSBmcm9tICdAbmlmaS1mZHMvY29yZSc7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi4vLi4vcGFja2FnZS5qc29uJztcbi8qKlxuICogRmRzU2VydmljZSBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAcGFyYW0gdGREYXRhVGFibGVTZXJ2aWNlICAgIFRoZSBjb3ZhbGVudCBkYXRhIHRhYmxlIHNlcnZpY2UgbW9kdWxlLlxuICogQHBhcmFtIGZkc0RpYWxvZ1NlcnZpY2UgICAgICBUaGUgRkRTIGRpYWxvZyBzZXJ2aWNlLlxuICogQHBhcmFtIGZkc1NuYWNrQmFyU2VydmljZSAgICBUaGUgRkRTIHNuYWNrIGJhciBzZXJ2aWNlIG1vZHVsZS5cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5cbmZ1bmN0aW9uIEZkc1NlcnZpY2UodGREYXRhVGFibGVTZXJ2aWNlLCBmZHNEaWFsb2dTZXJ2aWNlLCBmZHNTbmFja0JhclNlcnZpY2UpIHtcbiAgLy8gU2VydmljZXNcbiAgdGhpcy5kaWFsb2dTZXJ2aWNlID0gZmRzRGlhbG9nU2VydmljZTtcbiAgdGhpcy5zbmFja0JhclNlcnZpY2UgPSBmZHNTbmFja0JhclNlcnZpY2U7XG4gIHRoaXMuZGF0YVRhYmxlU2VydmljZSA9IHRkRGF0YVRhYmxlU2VydmljZTsgLy8gR2VuZXJhbFxuXG4gIHRoaXMudGl0bGUgPSAnQXBhY2hlIE5pRmkgRmxvdyBEZXNpZ24gU3lzdGVtIERlbW8gdicgKyB2ZXJzaW9uO1xuICB0aGlzLmluUHJvZ3Jlc3MgPSB0cnVlO1xuICB0aGlzLnBlcnNwZWN0aXZlID0gJyc7XG59XG5cbkZkc1NlcnZpY2UucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogRmRzU2VydmljZVxufTtcbkZkc1NlcnZpY2UucGFyYW1ldGVycyA9IFtUZERhdGFUYWJsZVNlcnZpY2UsIEZkc0RpYWxvZ1NlcnZpY2UsIEZkc1NuYWNrQmFyU2VydmljZV07XG5leHBvcnQgZGVmYXVsdCBGZHNTZXJ2aWNlOyJdLCJzb3VyY2VSb290IjoiIn0= |