(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('three')) : typeof define === 'function' && define.amd ? define(['exports', 'three'], factory) : (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.BlueMap = {}, global.THREE)); }(this, (function (exports, three) { 'use strict'; function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } it = o[Symbol.iterator](); return it.next.bind(it); } /** * Takes a base46 string and converts it into an image element * @param string * @returns {HTMLElement} */ var stringToImage = function stringToImage(string) { var image = document.createElementNS('http://www.w3.org/1999/xhtml', 'img'); image.src = string; return image; }; /** * Creates an optimized path from x,z coordinates used by bluemap to save tiles * @param x * @param z * @returns {string} */ var pathFromCoords = function pathFromCoords(x, z) { var path = 'x'; path += splitNumberToPath(x); path += 'z'; path += splitNumberToPath(z); path = path.substring(0, path.length - 1); return path; }; /** * Splits a number into an optimized folder-path used to save bluemap-tiles * @param num * @returns {string} */ var splitNumberToPath = function splitNumberToPath(num) { var path = ''; if (num < 0) { num = -num; path += '-'; } var s = parseInt(num).toString(); for (var i = 0; i < s.length; i++) { path += s.charAt(i) + '/'; } return path; }; /** * Hashes tile-coordinates to be saved in a map * @param x * @param z * @returns {string} */ var hashTile = function hashTile(x, z) { return "x" + x + "z" + z; }; /** * Dispatches an event to the element of this map-viewer * @param element the element on that the event is dispatched * @param event * @param detail * @returns {undefined|void|boolean} */ var dispatchEvent = function dispatchEvent(element, event, detail) { if (detail === void 0) { detail = {}; } if (!element || !element.dispatchEvent) return; return element.dispatchEvent(new CustomEvent(event, { detail: detail })); }; /** * Sends a "bluemapAlert" event with a message and a level. * The level can be anything, but the app uses the levels * - debug * - fine * - info * - warning * - error * @param element the element on that the event is dispatched * @param message * @param level */ var alert = function alert(element, message, level) { if (level === void 0) { level = "info"; } // alert event var printToConsole = dispatchEvent(element, "bluemapAlert", { message: message, level: level }); // log alert to console if (printToConsole) { if (level === "info") { console.log("[BlueMap/" + level + "]", message); } else if (level === "warning") { console.warn("[BlueMap/" + level + "]", message); } else if (level === "error") { console.error("[BlueMap/" + level + "]", message); } else { console.debug("[BlueMap/" + level + "]", message); } } }; /** * Source: https://stackoverflow.com/questions/494143/creating-a-new-dom-element-from-an-html-string-using-built-in-dom-methods-or-pro/35385518#35385518 * * @param {String} html representing a single element * @return {Element} */ var htmlToElement = function htmlToElement(html) { var template = document.createElement('template'); template.innerHTML = html.trim(); return template.content.firstChild; }; /** * Source: https://stackoverflow.com/questions/494143/creating-a-new-dom-element-from-an-html-string-using-built-in-dom-methods-or-pro/35385518#35385518 * * @param {String} html representing any number of sibling elements * @return {NodeList} */ var htmlToElements = function htmlToElements(html) { var template = document.createElement('template'); template.innerHTML = html; return template.content.childNodes; }; /** * Schedules an animation * @param durationMs the duration of the animation in ms * @param animationFrame a function that is getting called each frame with the parameters (progress (0-1), deltaTime) * @param postAnimation a function that gets called once after the animation is finished or cancelled. The function accepts one bool-parameter whether the animation was finished (true) or canceled (false) * @returns the animation object */ var animate = function animate(animationFrame, durationMs, postAnimation) { if (durationMs === void 0) { durationMs = 1000; } if (postAnimation === void 0) { postAnimation = null; } var animation = { animationStart: -1, lastFrame: -1, cancelled: false, frame: function frame(time) { var _this = this; if (this.cancelled) return; if (this.animationStart === -1) { this.animationStart = time; this.lastFrame = time; } var progress = three.MathUtils.clamp((time - this.animationStart) / durationMs, 0, 1); var deltaTime = time - this.lastFrame; animationFrame(progress, deltaTime); if (progress < 1) window.requestAnimationFrame(function (time) { return _this.frame(time); });else if (postAnimation) postAnimation(true); this.lastFrame = time; }, cancel: function cancel() { this.cancelled = true; if (postAnimation) postAnimation(false); } }; window.requestAnimationFrame(function (time) { return animation.frame(time); }); return animation; }; /** * Returns the offset position of an element * * Source: https://plainjs.com/javascript/styles/get-the-position-of-an-element-relative-to-the-document-24/ * * @param element * @returns {{top: number, left: number}} */ var elementOffset = function elementOffset(element) { var rect = element.getBoundingClientRect(), scrollLeft = window.pageXOffset || document.documentElement.scrollLeft, scrollTop = window.pageYOffset || document.documentElement.scrollTop; return { top: rect.top + scrollTop, left: rect.left + scrollLeft }; }; /* * This file is part of BlueMap, licensed under the MIT License (MIT). * * Copyright (c) Blue (Lukas Rieger) * Copyright (c) contributors * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ var Tile = /*#__PURE__*/function () { function Tile(x, z, onLoad, onUnload) { Object.defineProperty(this, 'isTile', { value: true }); this.model = null; this.onLoad = onLoad; this.onUnload = onUnload; this.x = x; this.z = z; this.unloaded = true; this.loading = false; } var _proto = Tile.prototype; _proto.load = function load(tileLoader) { var _this = this; if (this.loading) return; this.loading = true; this.unload(); this.unloaded = false; return tileLoader.load(this.x, this.z).then(function (model) { if (_this.unloaded) { model.geometry.dispose(); return; } _this.model = model; _this.onLoad(_this); }).finally(function () { _this.loading = false; }); }; _proto.unload = function unload() { this.unloaded = true; if (this.model) { this.onUnload(this); this.model.geometry.dispose(); this.model = null; } }; _createClass(Tile, [{ key: "loaded", get: function get() { return !!this.model; } }]); return Tile; }(); var TileMap = /*#__PURE__*/function () { function TileMap(width, height) { this.canvas = document.createElementNS('http://www.w3.org/1999/xhtml', 'canvas'); this.canvas.width = width; this.canvas.height = height; this.tileMapContext = this.canvas.getContext('2d', { alpha: false, willReadFrequently: true }); this.texture = new three.Texture(this.canvas); this.texture.generateMipmaps = false; this.texture.magFilter = three.LinearFilter; this.texture.minFilter = three.LinearFilter; this.texture.wrapS = three.ClampToEdgeWrapping; this.texture.wrapT = three.ClampToEdgeWrapping; this.texture.flipY = false; this.texture.needsUpdate = true; } var _proto = TileMap.prototype; _proto.setAll = function setAll(state) { this.tileMapContext.fillStyle = state; this.tileMapContext.fillRect(0, 0, this.canvas.width, this.canvas.height); this.texture.needsUpdate = true; }; _proto.setTile = function setTile(x, z, state) { this.tileMapContext.fillStyle = state; this.tileMapContext.fillRect(x, z, 1, 1); this.texture.needsUpdate = true; }; return TileMap; }(); TileMap.EMPTY = "#000"; TileMap.LOADED = "#fff"; /* * This file is part of BlueMap, licensed under the MIT License (MIT). * * Copyright (c) Blue (Lukas Rieger) * Copyright (c) contributors * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ var TileManager = /*#__PURE__*/function () { function TileManager(scene, tileLoader, onTileLoad, onTileUnload, events) { var _this = this; if (onTileLoad === void 0) { onTileLoad = null; } if (onTileUnload === void 0) { onTileUnload = null; } if (events === void 0) { events = null; } this.loadCloseTiles = function () { if (_this.unloaded) return; if (!_this.loadNextTile()) return; if (_this.loadTimeout) clearTimeout(_this.loadTimeout); if (_this.currentlyLoading < 4) { _this.loadTimeout = setTimeout(_this.loadCloseTiles, 0); } else { _this.loadTimeout = setTimeout(_this.loadCloseTiles, 1000); } }; this.handleLoadedTile = function (tile) { //this.tileMap.setTile(tile.x - this.centerTile.x + TileManager.tileMapHalfSize, tile.z - this.centerTile.y + TileManager.tileMapHalfSize, TileMap.LOADED); _this.scene.add(tile.model); _this.onTileLoad(tile); }; this.handleUnloadedTile = function (tile) { _this.tileMap.setTile(tile.x - _this.centerTile.x + TileManager.tileMapHalfSize, tile.z - _this.centerTile.y + TileManager.tileMapHalfSize, TileMap.EMPTY); _this.scene.remove(tile.model); _this.onTileUnload(tile); }; Object.defineProperty(this, 'isTileManager', { value: true }); this.events = events; this.scene = scene; this.tileLoader = tileLoader; this.onTileLoad = onTileLoad || function () {}; this.onTileUnload = onTileUnload || function () {}; this.viewDistanceX = 1; this.viewDistanceZ = 1; this.centerTile = new three.Vector2(0, 0); this.currentlyLoading = 0; this.loadTimeout = null; //map of loaded tiles this.tiles = {}; // a canvas that keeps track of the loaded tiles, used for shaders this.tileMap = new TileMap(TileManager.tileMapSize, TileManager.tileMapSize); this.unloaded = true; } var _proto = TileManager.prototype; _proto.loadAroundTile = function loadAroundTile(x, z, viewDistanceX, viewDistanceZ) { this.unloaded = false; this.viewDistanceX = viewDistanceX; this.viewDistanceZ = viewDistanceZ; if (this.centerTile.x !== x || this.centerTile.y !== z) { this.centerTile.set(x, z); this.removeFarTiles(); this.tileMap.setAll(TileMap.EMPTY); var keys = Object.keys(this.tiles); for (var i = 0; i < keys.length; i++) { if (!this.tiles.hasOwnProperty(keys[i])) continue; var tile = this.tiles[keys[i]]; if (!tile.loading) { this.tileMap.setTile(tile.x - this.centerTile.x + TileManager.tileMapHalfSize, tile.z - this.centerTile.y + TileManager.tileMapHalfSize, TileMap.LOADED); } } } this.loadCloseTiles(); }; _proto.unload = function unload() { this.unloaded = true; this.removeAllTiles(); }; _proto.removeFarTiles = function removeFarTiles() { var keys = Object.keys(this.tiles); for (var i = 0; i < keys.length; i++) { if (!this.tiles.hasOwnProperty(keys[i])) continue; var tile = this.tiles[keys[i]]; if (tile.x + this.viewDistanceX < this.centerTile.x || tile.x - this.viewDistanceX > this.centerTile.x || tile.z + this.viewDistanceZ < this.centerTile.y || tile.z - this.viewDistanceZ > this.centerTile.y) { tile.unload(); delete this.tiles[keys[i]]; } } }; _proto.removeAllTiles = function removeAllTiles() { this.tileMap.setAll(TileMap.EMPTY); var keys = Object.keys(this.tiles); for (var i = 0; i < keys.length; i++) { if (!this.tiles.hasOwnProperty(keys[i])) continue; var tile = this.tiles[keys[i]]; tile.unload(); delete this.tiles[keys[i]]; } }; _proto.loadNextTile = function loadNextTile() { if (this.unloaded) return; var x = 0; var z = 0; var d = 1; var m = 1; while (m < Math.max(this.viewDistanceX, this.viewDistanceZ) * 2 + 1) { while (2 * x * d < m) { if (this.tryLoadTile(this.centerTile.x + x, this.centerTile.y + z)) return true; x = x + d; } while (2 * z * d < m) { if (this.tryLoadTile(this.centerTile.x + x, this.centerTile.y + z)) return true; z = z + d; } d = -1 * d; m = m + 1; } return false; }; _proto.tryLoadTile = function tryLoadTile(x, z) { var _this2 = this; if (this.unloaded) return; if (Math.abs(x - this.centerTile.x) > this.viewDistanceX) return false; if (Math.abs(z - this.centerTile.y) > this.viewDistanceZ) return false; var tileHash = hashTile(x, z); var tile = this.tiles[tileHash]; if (tile !== undefined) return false; this.currentlyLoading++; tile = new Tile(x, z, this.handleLoadedTile, this.handleUnloadedTile); this.tiles[tileHash] = tile; tile.load(this.tileLoader).then(function () { _this2.tileMap.setTile(tile.x - _this2.centerTile.x + TileManager.tileMapHalfSize, tile.z - _this2.centerTile.y + TileManager.tileMapHalfSize, TileMap.LOADED); if (_this2.loadTimeout) clearTimeout(_this2.loadTimeout); _this2.loadTimeout = setTimeout(_this2.loadCloseTiles, 0); }).catch(function (error) { if (error.status && error.status === "empty") return; if (error.target && error.target.status === 404) return; alert(_this2.events, "Failed to load tile: " + error, "warning"); }).finally(function () { _this2.tileMap.setTile(tile.x - _this2.centerTile.x + TileManager.tileMapHalfSize, tile.z - _this2.centerTile.y + TileManager.tileMapHalfSize, TileMap.LOADED); _this2.currentlyLoading--; }); return true; }; return TileManager; }(); TileManager.tileMapSize = 100; TileManager.tileMapHalfSize = TileManager.tileMapSize / 2; var TileLoader = function TileLoader(tilePath, material, tileSettings, layer) { var _this = this; if (layer === void 0) { layer = 0; } this.load = function (tileX, tileZ) { return new Promise(function (resolve, reject) { _this.fileLoader.load(_this.tilePath + pathFromCoords(tileX, tileZ) + '.json', function (geometryJson) { if (!geometryJson.type || geometryJson.type !== 'BufferGeometry') reject({ status: "empty" }); var geometry = _this.bufferGeometryLoader.parse(geometryJson); var object = new three.Mesh(geometry, _this.material); if (_this.layer) object.layers.set(_this.layer); var tileSize = _this.tileSettings.tileSize; var translate = _this.tileSettings.translate; var scale = _this.tileSettings.scale; object.position.set(tileX * tileSize.x + translate.x, 0, tileZ * tileSize.z + translate.z); object.scale.set(scale.x, 1, scale.z); object.updateMatrixWorld(true); resolve(object); }, function () {}, reject); }); }; Object.defineProperty(this, 'isTileLoader', { value: true }); this.tilePath = tilePath; this.material = material; this.tileSettings = tileSettings; this.layer = layer; this.fileLoader = new three.FileLoader(); this.fileLoader.setResponseType('json'); this.bufferGeometryLoader = new three.BufferGeometryLoader(); }; var Marker = /*#__PURE__*/function () { function Marker(markerSet, id) { Object.defineProperty(this, 'isMarker', { value: true }); this.manager = markerSet.manager; this.markerSet = markerSet; this.id = id; this._position = new three.Vector3(); this._label = null; this.link = null; this.newTab = true; this.minDistance = 0.0; this.maxDistance = 100000.0; this.opacity = 1; this._source = Marker.Source.CUSTOM; this._onDisposal = []; this._distance = 0; this._opacity = 1; this._posRelativeToCamera = new three.Vector3(); this._cameraDirection = new three.Vector3(); } var _proto = Marker.prototype; _proto.update = function update(markerData) { this._source = Marker.Source.MARKER_FILE; if (markerData.position) { this.setPosition(parseFloat(markerData.position.x), parseFloat(markerData.position.y), parseFloat(markerData.position.z)); } else { this.setPosition(0, 0, 0); } this.label = markerData.label ? markerData.label : null; this.link = markerData.link ? markerData.link : null; this.newTab = !!markerData.newTab; this.minDistance = parseFloat(markerData.minDistance ? markerData.minDistance : 0.0); this.maxDistance = parseFloat(markerData.maxDistance ? markerData.maxDistance : 100000.0); }; _proto.setPosition = function setPosition(x, y, z) { this.position.set(x, y, z); }; _proto.onClick = function onClick(clickPosition) { if (!dispatchEvent(this.manager.events, 'bluemapMarkerClick', { marker: this })) return; this.followLink(); if (this.label) { this.manager.showPopup("
" + this.label + "
", clickPosition.x, clickPosition.y, clickPosition.z, true); } }; _proto.followLink = function followLink() { if (this.link) { if (this.newTab) { window.open(this.link, '_blank'); } else { location.href = this.link; } } }; _proto._onBeforeRender = function _onBeforeRender(renderer, scene, camera) { //calculate "orthographic distance" to marker this._posRelativeToCamera.subVectors(this.position, camera.position); camera.getWorldDirection(this._cameraDirection); this._distance = this._posRelativeToCamera.dot(this._cameraDirection); //calculate opacity based on (min/max)distance this._opacity = Math.min(1 - three.MathUtils.clamp((this._distance - this.maxDistance) / (this.maxDistance * 2), 0, 1), three.MathUtils.clamp((this._distance - this.minDistance) / (this.minDistance * 2 + 1), 0, 1)) * this.opacity; }; _proto.blendIn = function blendIn(durationMs, postAnimation) { var _this = this; if (durationMs === void 0) { durationMs = 500; } if (postAnimation === void 0) { postAnimation = null; } this.opacity = 0; animate(function (progress) { _this.opacity = progress; }, durationMs, postAnimation); }; _proto.blendOut = function blendOut(durationMs, postAnimation) { var _this2 = this; if (durationMs === void 0) { durationMs = 500; } if (postAnimation === void 0) { postAnimation = null; } var startOpacity = this.opacity; animate(function (progress) { _this2.opacity = startOpacity * (1 - progress); }, durationMs, postAnimation); }; _proto.dispose = function dispose() { var _this3 = this; this._onDisposal.forEach(function (callback) { return callback(_this3); }); delete this.markerSet._marker[this.id]; }; Marker.normalizeColor = function normalizeColor(color) { if (!color) color = {}; color.r = Marker.normaliseNumber(color.r, 255, true); color.g = Marker.normaliseNumber(color.g, 0, true); color.b = Marker.normaliseNumber(color.b, 0, true); color.a = Marker.normaliseNumber(color.a, 1, false); color.rgb = (color.r << 16) + (color.g << 8) + color.b; color.vec4 = new three.Vector4(color.r / 255, color.g / 255, color.b / 255, color.a); return color; }; Marker.normaliseNumber = function normaliseNumber(nr, def, integer) { if (integer === void 0) { integer = false; } if (isNaN(nr)) { if (integer) nr = parseInt(nr);else nr = parseFloat(nr); if (isNaN(nr)) return def; return nr; } if (integer) return Math.floor(nr); return nr; }; _createClass(Marker, [{ key: "position", get: function get() { return this._position; } }, { key: "label", set: function set(label) { this._label = label; }, get: function get() { return this._label; } }, { key: "onDisposal", set: function set(callback) { this._onDisposal.push(callback); } }]); return Marker; }(); Marker.Source = { CUSTOM: 0, MARKER_FILE: 1 }; /** * parameters = { * color: , * linewidth: , * dashed: , * dashScale: , * dashSize: , * gapSize: , * resolution: , // to be set by renderer * } */ three.UniformsLib.line = { linewidth: { value: 1 }, resolution: { value: new three.Vector2(1, 1) }, dashScale: { value: 1 }, dashSize: { value: 1 }, gapSize: { value: 1 }, // todo FIX - maybe change to totalSize opacity: { value: 1 } }; three.ShaderLib['line'] = { uniforms: three.UniformsUtils.merge([three.UniformsLib.common, three.UniformsLib.fog, three.UniformsLib.line]), vertexShader: "\n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\n\t\tuniform float linewidth;\n\t\tuniform vec2 resolution;\n\n\t\tattribute vec3 instanceStart;\n\t\tattribute vec3 instanceEnd;\n\n\t\tattribute vec3 instanceColorStart;\n\t\tattribute vec3 instanceColorEnd;\n\n\t\tvarying vec2 vUv;\n\n\t\t#ifdef USE_DASH\n\n\t\t\tuniform float dashScale;\n\t\t\tattribute float instanceDistanceStart;\n\t\t\tattribute float instanceDistanceEnd;\n\t\t\tvarying float vLineDistance;\n\n\t\t#endif\n\n\t\tvoid trimSegment( const in vec4 start, inout vec4 end ) {\n\n\t\t\t// trim end segment so it terminates between the camera plane and the near plane\n\n\t\t\t// conservative estimate of the near plane\n\t\t\tfloat a = projectionMatrix[ 2 ][ 2 ]; // 3nd entry in 3th column\n\t\t\tfloat b = projectionMatrix[ 3 ][ 2 ]; // 3nd entry in 4th column\n\t\t\tfloat nearEstimate = - 0.5 * b / a;\n\n\t\t\tfloat alpha = ( nearEstimate - start.z ) / ( end.z - start.z );\n\n\t\t\tend.xyz = mix( start.xyz, end.xyz, alpha );\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\t#ifdef USE_COLOR\n\n\t\t\t\tvColor.xyz = ( position.y < 0.5 ) ? instanceColorStart : instanceColorEnd;\n\n\t\t\t#endif\n\n\t\t\t#ifdef USE_DASH\n\n\t\t\t\tvLineDistance = ( position.y < 0.5 ) ? dashScale * instanceDistanceStart : dashScale * instanceDistanceEnd;\n\n\t\t\t#endif\n\n\t\t\tfloat aspect = resolution.x / resolution.y;\n\n\t\t\tvUv = uv;\n\n\t\t\t// camera space\n\t\t\tvec4 start = modelViewMatrix * vec4( instanceStart, 1.0 );\n\t\t\tvec4 end = modelViewMatrix * vec4( instanceEnd, 1.0 );\n\n\t\t\t// special case for perspective projection, and segments that terminate either in, or behind, the camera plane\n\t\t\t// clearly the gpu firmware has a way of addressing this issue when projecting into ndc space\n\t\t\t// but we need to perform ndc-space calculations in the shader, so we must address this issue directly\n\t\t\t// perhaps there is a more elegant solution -- WestLangley\n\n\t\t\tbool perspective = ( projectionMatrix[ 2 ][ 3 ] == - 1.0 ); // 4th entry in the 3rd column\n\n\t\t\tif ( perspective ) {\n\n\t\t\t\tif ( start.z < 0.0 && end.z >= 0.0 ) {\n\n\t\t\t\t\ttrimSegment( start, end );\n\n\t\t\t\t} else if ( end.z < 0.0 && start.z >= 0.0 ) {\n\n\t\t\t\t\ttrimSegment( end, start );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// clip space\n\t\t\tvec4 clipStart = projectionMatrix * start;\n\t\t\tvec4 clipEnd = projectionMatrix * end;\n\n\t\t\t// ndc space\n\t\t\tvec2 ndcStart = clipStart.xy / clipStart.w;\n\t\t\tvec2 ndcEnd = clipEnd.xy / clipEnd.w;\n\n\t\t\t// direction\n\t\t\tvec2 dir = ndcEnd - ndcStart;\n\n\t\t\t// account for clip-space aspect ratio\n\t\t\tdir.x *= aspect;\n\t\t\tdir = normalize( dir );\n\n\t\t\t// perpendicular to dir\n\t\t\tvec2 offset = vec2( dir.y, - dir.x );\n\n\t\t\t// undo aspect ratio adjustment\n\t\t\tdir.x /= aspect;\n\t\t\toffset.x /= aspect;\n\n\t\t\t// sign flip\n\t\t\tif ( position.x < 0.0 ) offset *= - 1.0;\n\n\t\t\t// endcaps\n\t\t\tif ( position.y < 0.0 ) {\n\n\t\t\t\toffset += - dir;\n\n\t\t\t} else if ( position.y > 1.0 ) {\n\n\t\t\t\toffset += dir;\n\n\t\t\t}\n\n\t\t\t// adjust for linewidth\n\t\t\toffset *= linewidth;\n\n\t\t\t// adjust for clip-space to screen-space conversion // maybe resolution should be based on viewport ...\n\t\t\toffset /= resolution.y;\n\n\t\t\t// select end\n\t\t\tvec4 clip = ( position.y < 0.5 ) ? clipStart : clipEnd;\n\n\t\t\t// back to clip space\n\t\t\toffset *= clip.w;\n\n\t\t\tclip.xy += offset;\n\n\t\t\tgl_Position = clip;\n\n\t\t\tvec4 mvPosition = ( position.y < 0.5 ) ? start : end; // this is an approximation\n\n\t\t\t#include \n\t\t\t#include \n\t\t\t#include \n\n\t\t}\n\t\t", fragmentShader: "\n\t\tuniform vec3 diffuse;\n\t\tuniform float opacity;\n\n\t\t#ifdef USE_DASH\n\n\t\t\tuniform float dashSize;\n\t\t\tuniform float gapSize;\n\n\t\t#endif\n\n\t\tvarying float vLineDistance;\n\n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\t#include \n\n\t\t\t#ifdef USE_DASH\n\n\t\t\t\tif ( vUv.y < - 1.0 || vUv.y > 1.0 ) discard; // discard endcaps\n\n\t\t\t\tif ( mod( vLineDistance, dashSize + gapSize ) > dashSize ) discard; // todo - FIX\n\n\t\t\t#endif\n\n\t\t\tif ( abs( vUv.y ) > 1.0 ) {\n\n\t\t\t\tfloat a = vUv.x;\n\t\t\t\tfloat b = ( vUv.y > 0.0 ) ? vUv.y - 1.0 : vUv.y + 1.0;\n\t\t\t\tfloat len2 = a * a + b * b;\n\n\t\t\t\tif ( len2 > 1.0 ) discard;\n\n\t\t\t}\n\n\t\t\tvec4 diffuseColor = vec4( diffuse, opacity );\n\n\t\t\t#include \n\t\t\t#include \n\n\t\t\tgl_FragColor = vec4( diffuseColor.rgb, diffuseColor.a );\n\n\t\t\t#include \n\t\t\t#include \n\t\t\t#include \n\t\t\t#include \n\n\t\t}\n\t\t" }; var LineMaterial = function LineMaterial(parameters) { three.ShaderMaterial.call(this, { type: 'LineMaterial', uniforms: three.UniformsUtils.clone(three.ShaderLib['line'].uniforms), vertexShader: three.ShaderLib['line'].vertexShader, fragmentShader: three.ShaderLib['line'].fragmentShader, clipping: true // required for clipping support }); this.dashed = false; Object.defineProperties(this, { color: { enumerable: true, get: function get() { return this.uniforms.diffuse.value; }, set: function set(value) { this.uniforms.diffuse.value = value; } }, linewidth: { enumerable: true, get: function get() { return this.uniforms.linewidth.value; }, set: function set(value) { this.uniforms.linewidth.value = value; } }, dashScale: { enumerable: true, get: function get() { return this.uniforms.dashScale.value; }, set: function set(value) { this.uniforms.dashScale.value = value; } }, dashSize: { enumerable: true, get: function get() { return this.uniforms.dashSize.value; }, set: function set(value) { this.uniforms.dashSize.value = value; } }, gapSize: { enumerable: true, get: function get() { return this.uniforms.gapSize.value; }, set: function set(value) { this.uniforms.gapSize.value = value; } }, opacity: { enumerable: true, get: function get() { return this.uniforms.opacity.value; }, set: function set(value) { this.uniforms.opacity.value = value; } }, resolution: { enumerable: true, get: function get() { return this.uniforms.resolution.value; }, set: function set(value) { this.uniforms.resolution.value.copy(value); } } }); this.setValues(parameters); }; LineMaterial.prototype = Object.create(three.ShaderMaterial.prototype); LineMaterial.prototype.constructor = LineMaterial; LineMaterial.prototype.isLineMaterial = true; var LineSegmentsGeometry = function LineSegmentsGeometry() { three.InstancedBufferGeometry.call(this); this.type = 'LineSegmentsGeometry'; var positions = [-1, 2, 0, 1, 2, 0, -1, 1, 0, 1, 1, 0, -1, 0, 0, 1, 0, 0, -1, -1, 0, 1, -1, 0]; var uvs = [-1, 2, 1, 2, -1, 1, 1, 1, -1, -1, 1, -1, -1, -2, 1, -2]; var index = [0, 2, 1, 2, 3, 1, 2, 4, 3, 4, 5, 3, 4, 6, 5, 6, 7, 5]; this.setIndex(index); this.setAttribute('position', new three.Float32BufferAttribute(positions, 3)); this.setAttribute('uv', new three.Float32BufferAttribute(uvs, 2)); }; LineSegmentsGeometry.prototype = Object.assign(Object.create(three.InstancedBufferGeometry.prototype), { constructor: LineSegmentsGeometry, isLineSegmentsGeometry: true, applyMatrix4: function applyMatrix4(matrix) { var start = this.attributes.instanceStart; var end = this.attributes.instanceEnd; if (start !== undefined) { start.applyMatrix4(matrix); end.applyMatrix4(matrix); start.needsUpdate = true; } if (this.boundingBox !== null) { this.computeBoundingBox(); } if (this.boundingSphere !== null) { this.computeBoundingSphere(); } return this; }, setPositions: function setPositions(array) { var lineSegments; if (array instanceof Float32Array) { lineSegments = array; } else if (Array.isArray(array)) { lineSegments = new Float32Array(array); } var instanceBuffer = new three.InstancedInterleavedBuffer(lineSegments, 6, 1); // xyz, xyz this.setAttribute('instanceStart', new three.InterleavedBufferAttribute(instanceBuffer, 3, 0)); // xyz this.setAttribute('instanceEnd', new three.InterleavedBufferAttribute(instanceBuffer, 3, 3)); // xyz // this.computeBoundingBox(); this.computeBoundingSphere(); return this; }, setColors: function setColors(array) { var colors; if (array instanceof Float32Array) { colors = array; } else if (Array.isArray(array)) { colors = new Float32Array(array); } var instanceColorBuffer = new three.InstancedInterleavedBuffer(colors, 6, 1); // rgb, rgb this.setAttribute('instanceColorStart', new three.InterleavedBufferAttribute(instanceColorBuffer, 3, 0)); // rgb this.setAttribute('instanceColorEnd', new three.InterleavedBufferAttribute(instanceColorBuffer, 3, 3)); // rgb return this; }, fromWireframeGeometry: function fromWireframeGeometry(geometry) { this.setPositions(geometry.attributes.position.array); return this; }, fromEdgesGeometry: function fromEdgesGeometry(geometry) { this.setPositions(geometry.attributes.position.array); return this; }, fromMesh: function fromMesh(mesh) { this.fromWireframeGeometry(new three.WireframeGeometry(mesh.geometry)); // set colors, maybe return this; }, fromLineSegments: function fromLineSegments(lineSegments) { var geometry = lineSegments.geometry; if (geometry.isGeometry) { this.setPositions(geometry.vertices); } else if (geometry.isBufferGeometry) { this.setPositions(geometry.attributes.position.array); // assumes non-indexed } // set colors, maybe return this; }, computeBoundingBox: function () { var box = new three.Box3(); return function computeBoundingBox() { if (this.boundingBox === null) { this.boundingBox = new three.Box3(); } var start = this.attributes.instanceStart; var end = this.attributes.instanceEnd; if (start !== undefined && end !== undefined) { this.boundingBox.setFromBufferAttribute(start); box.setFromBufferAttribute(end); this.boundingBox.union(box); } }; }(), computeBoundingSphere: function () { var vector = new three.Vector3(); return function computeBoundingSphere() { if (this.boundingSphere === null) { this.boundingSphere = new three.Sphere(); } if (this.boundingBox === null) { this.computeBoundingBox(); } var start = this.attributes.instanceStart; var end = this.attributes.instanceEnd; if (start !== undefined && end !== undefined) { var center = this.boundingSphere.center; this.boundingBox.getCenter(center); var maxRadiusSq = 0; for (var i = 0, il = start.count; i < il; i++) { vector.fromBufferAttribute(start, i); maxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(vector)); vector.fromBufferAttribute(end, i); maxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(vector)); } this.boundingSphere.radius = Math.sqrt(maxRadiusSq); if (isNaN(this.boundingSphere.radius)) { console.error('THREE.LineSegmentsGeometry.computeBoundingSphere(): Computed radius is NaN. The instanced position data is likely to have NaN values.', this); } } }; }(), toJSON: function toJSON() {// todo }, applyMatrix: function applyMatrix(matrix) { console.warn('THREE.LineSegmentsGeometry: applyMatrix() has been renamed to applyMatrix4().'); return this.applyMatrix4(matrix); } }); var LineGeometry = function LineGeometry() { LineSegmentsGeometry.call(this); this.type = 'LineGeometry'; }; LineGeometry.prototype = Object.assign(Object.create(LineSegmentsGeometry.prototype), { constructor: LineGeometry, isLineGeometry: true, setPositions: function setPositions(array) { // converts [ x1, y1, z1, x2, y2, z2, ... ] to pairs format var length = array.length - 3; var points = new Float32Array(2 * length); for (var i = 0; i < length; i += 3) { points[2 * i] = array[i]; points[2 * i + 1] = array[i + 1]; points[2 * i + 2] = array[i + 2]; points[2 * i + 3] = array[i + 3]; points[2 * i + 4] = array[i + 4]; points[2 * i + 5] = array[i + 5]; } LineSegmentsGeometry.prototype.setPositions.call(this, points); return this; }, setColors: function setColors(array) { // converts [ r1, g1, b1, r2, g2, b2, ... ] to pairs format var length = array.length - 3; var colors = new Float32Array(2 * length); for (var i = 0; i < length; i += 3) { colors[2 * i] = array[i]; colors[2 * i + 1] = array[i + 1]; colors[2 * i + 2] = array[i + 2]; colors[2 * i + 3] = array[i + 3]; colors[2 * i + 4] = array[i + 4]; colors[2 * i + 5] = array[i + 5]; } LineSegmentsGeometry.prototype.setColors.call(this, colors); return this; }, fromLine: function fromLine(line) { var geometry = line.geometry; if (geometry.isGeometry) { this.setPositions(geometry.vertices); } else if (geometry.isBufferGeometry) { this.setPositions(geometry.attributes.position.array); // assumes non-indexed } // set colors, maybe return this; }, copy: function copy() /* source */ { // todo return this; } }); var LineSegments2 = function LineSegments2(geometry, material) { if (geometry === undefined) geometry = new LineSegmentsGeometry(); if (material === undefined) material = new LineMaterial({ color: Math.random() * 0xffffff }); three.Mesh.call(this, geometry, material); this.type = 'LineSegments2'; }; LineSegments2.prototype = Object.assign(Object.create(three.Mesh.prototype), { constructor: LineSegments2, isLineSegments2: true, computeLineDistances: function () { // for backwards-compatability, but could be a method of LineSegmentsGeometry... var start = new three.Vector3(); var end = new three.Vector3(); return function computeLineDistances() { var geometry = this.geometry; var instanceStart = geometry.attributes.instanceStart; var instanceEnd = geometry.attributes.instanceEnd; var lineDistances = new Float32Array(2 * instanceStart.data.count); for (var i = 0, j = 0, l = instanceStart.data.count; i < l; i++, j += 2) { start.fromBufferAttribute(instanceStart, i); end.fromBufferAttribute(instanceEnd, i); lineDistances[j] = j === 0 ? 0 : lineDistances[j - 1]; lineDistances[j + 1] = lineDistances[j] + start.distanceTo(end); } var instanceDistanceBuffer = new three.InstancedInterleavedBuffer(lineDistances, 2, 1); // d0, d1 geometry.setAttribute('instanceDistanceStart', new three.InterleavedBufferAttribute(instanceDistanceBuffer, 1, 0)); // d0 geometry.setAttribute('instanceDistanceEnd', new three.InterleavedBufferAttribute(instanceDistanceBuffer, 1, 1)); // d1 return this; }; }(), raycast: function () { var start = new three.Vector4(); var end = new three.Vector4(); var ssOrigin = new three.Vector4(); var ssOrigin3 = new three.Vector3(); var mvMatrix = new three.Matrix4(); var line = new three.Line3(); var closestPoint = new three.Vector3(); return function raycast(raycaster, intersects) { if (raycaster.camera === null) { console.error('LineSegments2: "Raycaster.camera" needs to be set in order to raycast against LineSegments2.'); } var threshold = raycaster.params.Line2 !== undefined ? raycaster.params.Line2.threshold || 0 : 0; var ray = raycaster.ray; var camera = raycaster.camera; var projectionMatrix = camera.projectionMatrix; var geometry = this.geometry; var material = this.material; var resolution = material.resolution; var lineWidth = material.linewidth + threshold; var instanceStart = geometry.attributes.instanceStart; var instanceEnd = geometry.attributes.instanceEnd; // pick a point 1 unit out along the ray to avoid the ray origin // sitting at the camera origin which will cause "w" to be 0 when // applying the projection matrix. ray.at(1, ssOrigin); // ndc space [ - 1.0, 1.0 ] ssOrigin.w = 1; ssOrigin.applyMatrix4(camera.matrixWorldInverse); ssOrigin.applyMatrix4(projectionMatrix); ssOrigin.multiplyScalar(1 / ssOrigin.w); // screen space ssOrigin.x *= resolution.x / 2; ssOrigin.y *= resolution.y / 2; ssOrigin.z = 0; ssOrigin3.copy(ssOrigin); var matrixWorld = this.matrixWorld; mvMatrix.multiplyMatrices(camera.matrixWorldInverse, matrixWorld); for (var i = 0, l = instanceStart.count; i < l; i++) { start.fromBufferAttribute(instanceStart, i); end.fromBufferAttribute(instanceEnd, i); start.w = 1; end.w = 1; // camera space start.applyMatrix4(mvMatrix); end.applyMatrix4(mvMatrix); // clip space start.applyMatrix4(projectionMatrix); end.applyMatrix4(projectionMatrix); // ndc space [ - 1.0, 1.0 ] start.multiplyScalar(1 / start.w); end.multiplyScalar(1 / end.w); // skip the segment if it's outside the camera near and far planes var isBehindCameraNear = start.z < -1 && end.z < -1; var isPastCameraFar = start.z > 1 && end.z > 1; if (isBehindCameraNear || isPastCameraFar) { continue; } // screen space start.x *= resolution.x / 2; start.y *= resolution.y / 2; end.x *= resolution.x / 2; end.y *= resolution.y / 2; // create 2d segment line.start.copy(start); line.start.z = 0; line.end.copy(end); line.end.z = 0; // get closest point on ray to segment var param = line.closestPointToPointParameter(ssOrigin3, true); line.at(param, closestPoint); // check if the intersection point is within clip space var zPos = three.MathUtils.lerp(start.z, end.z, param); var isInClipSpace = zPos >= -1 && zPos <= 1; var isInside = ssOrigin3.distanceTo(closestPoint) < lineWidth * 0.5; if (isInClipSpace && isInside) { line.start.fromBufferAttribute(instanceStart, i); line.end.fromBufferAttribute(instanceEnd, i); line.start.applyMatrix4(matrixWorld); line.end.applyMatrix4(matrixWorld); var pointOnLine = new three.Vector3(); var point = new three.Vector3(); ray.distanceSqToSegment(line.start, line.end, point, pointOnLine); intersects.push({ point: point, pointOnLine: pointOnLine, distance: ray.origin.distanceTo(point), object: this, face: null, faceIndex: i, uv: null, uv2: null }); } } }; }() }); var Line2 = function Line2(geometry, material) { if (geometry === undefined) geometry = new LineGeometry(); if (material === undefined) material = new LineMaterial({ color: Math.random() * 0xffffff }); LineSegments2.call(this, geometry, material); this.type = 'Line2'; }; Line2.prototype = Object.assign(Object.create(LineSegments2.prototype), { constructor: Line2, isLine2: true }); /* * This file is part of BlueMap, licensed under the MIT License (MIT). * * Copyright (c) Blue (Lukas Rieger) * Copyright (c) contributors * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the 'Software'), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ var MARKER_FILL_FRAGMENT_SHADER = "\n" + three.ShaderChunk.logdepthbuf_pars_fragment + "\n\nvarying vec3 vPosition;\nvarying vec3 vWorldPosition;\nvarying vec3 vNormal;\nvarying vec2 vUv;\nvarying vec3 vColor;\n\nuniform vec4 markerColor;\n\nvoid main() {\n\tvec4 color = markerColor;\n\t\n\t//apply vertex-color\n\tcolor.rgb *= vColor.rgb;\n\t\n\tgl_FragColor = color;\n\t\n\t" + three.ShaderChunk.logdepthbuf_fragment + "\n}\n"; /* * This file is part of BlueMap, licensed under the MIT License (MIT). * * Copyright (c) Blue (Lukas Rieger) * Copyright (c) contributors * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the 'Software'), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ var MARKER_FILL_VERTEX_SHADER = "\n#include \n" + three.ShaderChunk.logdepthbuf_pars_vertex + "\n\nvarying vec3 vPosition;\nvarying vec3 vWorldPosition;\nvarying vec3 vNormal;\nvarying vec2 vUv;\nvarying vec3 vColor;\n\nvoid main() {\n\tvPosition = position;\n\tvWorldPosition = (modelMatrix * vec4(position, 1)).xyz;\n\tvNormal = normal;\n\tvUv = uv;\n\tvColor = vec3(1.0);\n\t\n\tgl_Position = \n\t\tprojectionMatrix *\n\t\tviewMatrix *\n\t\tmodelMatrix *\n\t\tvec4(position, 1);\n\t\n\t" + three.ShaderChunk.logdepthbuf_vertex + " \n}\n"; var ShapeMarker = /*#__PURE__*/function (_Marker) { _inheritsLoose(ShapeMarker, _Marker); function ShapeMarker(markerSet, id, parentObject) { var _this; _this = _Marker.call(this, markerSet, id) || this; Object.defineProperty(_assertThisInitialized(_this), 'isShapeMarker', { value: true }); Object.defineProperty(_assertThisInitialized(_this), 'type', { value: "shape" }); var fillColor = Marker.normalizeColor({}); var borderColor = Marker.normalizeColor({}); var lineWidth = 2; var depthTest = false; _this._lineOpacity = 1; _this._fillOpacity = 1; _this._markerObject = new three.Object3D(); _this._markerObject.position.copy(_this.position); parentObject.add(_this._markerObject); _this._markerFillMaterial = new three.ShaderMaterial({ vertexShader: MARKER_FILL_VERTEX_SHADER, fragmentShader: MARKER_FILL_FRAGMENT_SHADER, side: three.DoubleSide, depthTest: depthTest, transparent: true, uniforms: { markerColor: { value: fillColor.vec4 } } }); _this._markerLineMaterial = new LineMaterial({ color: new three.Color(borderColor.rgb), opacity: borderColor.a, transparent: true, linewidth: lineWidth, depthTest: depthTest, vertexColors: false, dashed: false }); _this._markerLineMaterial.resolution.set(window.innerWidth, window.innerHeight); return _this; } var _proto = ShapeMarker.prototype; _proto.update = function update(markerData) { _Marker.prototype.update.call(this, markerData); this.height = markerData.height ? parseFloat(markerData.height) : 0.0; this.depthTest = !!markerData.depthTest; if (markerData.fillColor) this.fillColor = markerData.fillColor; if (markerData.borderColor) this.borderColor = markerData.borderColor; this.lineWidth = markerData.lineWidth ? parseFloat(markerData.lineWidth) : 2; var points = []; if (Array.isArray(markerData.shape)) { markerData.shape.forEach(function (point) { points.push(new three.Vector2(parseFloat(point.x), parseFloat(point.z))); }); } this.shape = points; }; _proto._onBeforeRender = function _onBeforeRender(renderer, scene, camera) { _Marker.prototype._onBeforeRender.call(this, renderer, scene, camera); this._markerFillMaterial.uniforms.markerColor.value.w = this._fillOpacity * this._opacity; this._markerLineMaterial.opacity = this._lineOpacity * this._opacity; }; _proto.dispose = function dispose() { this._markerObject.parent.remove(this._markerObject); this._markerObject.children.forEach(function (child) { if (child.geometry && child.geometry.isGeometry) child.geometry.dispose(); }); this._markerObject.clear(); this._markerFillMaterial.dispose(); this._markerLineMaterial.dispose(); _Marker.prototype.dispose.call(this); } /** * Sets the fill-color * * color-object format: *
	   * {
	   *     r: 0,    // int 0-255 red
	   *     g: 0,    // int 0-255 green
	   *     b: 0,    // int 0-255 blue
	   *     a: 0     // float 0-1 alpha
	   * }
	   * 
* * @param color {Object} */ ; _createClass(ShapeMarker, [{ key: "fillColor", set: function set(color) { color = Marker.normalizeColor(color); this._markerFillMaterial.uniforms.markerColor.value = color.vec4; this._fillOpacity = color.a; this._markerFillMaterial.needsUpdate = true; } /** * Sets the border-color * * color-object format: *
	     * {
	     *     r: 0,    // int 0-255 red
	     *     g: 0,    // int 0-255 green
	     *     b: 0,    // int 0-255 blue
	     *     a: 0     // float 0-1 alpha
	     * }
	     * 
* * @param color {Object} */ }, { key: "borderColor", set: function set(color) { color = Marker.normalizeColor(color); this._markerLineMaterial.color.setHex(color.rgb); this._lineOpacity = color.a; this._markerLineMaterial.needsUpdate = true; } /** * Sets the width of the marker-line * @param width {number} */ }, { key: "lineWidth", set: function set(width) { this._markerLineMaterial.linewidth = width; this._markerLineMaterial.needsUpdate = true; } /** * Sets if this marker can be seen through terrain * @param test {boolean} */ }, { key: "depthTest", set: function set(test) { this._markerFillMaterial.depthTest = test; this._markerFillMaterial.needsUpdate = true; this._markerLineMaterial.depthTest = test; this._markerLineMaterial.needsUpdate = true; }, get: function get() { return this._markerFillMaterial.depthTest; } /** * Sets the height of this marker * @param height {number} */ }, { key: "height", set: function set(height) { this._markerObject.position.y = height; } /** * Sets the points for the shape of this marker. * @param points {Vector2[]} */ }, { key: "shape", set: function set(points) { var _this2 = this; // remove old marker this._markerObject.children.forEach(function (child) { if (child.geometry && child.geometry.isGeometry) child.geometry.dispose(); }); this._markerObject.clear(); if (points.length < 3) return; this._markerObject.position.x = this.position.x; this._markerObject.position.z = this.position.z; // border-line var points3d = []; points.forEach(function (point) { return points3d.push(point.x, 0, point.y); }); points3d.push(points[0].x, 0, points[0].y); var lineGeo = new LineGeometry(); lineGeo.setPositions(points3d); lineGeo.translate(-this.position.x, 0.01456, -this.position.z); var line = new Line2(lineGeo, this._markerLineMaterial); line.onBeforeRender = function (renderer) { return renderer.getSize(line.material.resolution); }; line.computeLineDistances(); line.marker = this; this._markerObject.add(line); // fill if (this._markerFillMaterial.uniforms.markerColor.value.w > 0) { var shape = new three.Shape(points); var fillGeo = new three.ShapeBufferGeometry(shape, 1); fillGeo.rotateX(Math.PI / 2); //make y to z fillGeo.translate(-this.position.x, 0.01456, -this.position.z); var fill = new three.Mesh(fillGeo, this._markerFillMaterial); fill.marker = this; this._markerObject.add(fill); } // put render-hook on first object if (this._markerObject.children.length > 0) { var oldHook = this._markerObject.children[0].onBeforeRender; this._markerObject.children[0].onBeforeRender = function (renderer, scene, camera, geometry, material, group) { _this2._onBeforeRender(renderer, scene, camera); oldHook(renderer, scene, camera, geometry, material, group); }; } } }]); return ShapeMarker; }(Marker); var LineMarker = /*#__PURE__*/function (_Marker) { _inheritsLoose(LineMarker, _Marker); function LineMarker(markerSet, id, parentObject) { var _this; _this = _Marker.call(this, markerSet, id) || this; Object.defineProperty(_assertThisInitialized(_this), 'isLineMarker', { value: true }); Object.defineProperty(_assertThisInitialized(_this), 'type', { value: "line" }); var lineColor = Marker.normalizeColor({}); var lineWidth = 2; var depthTest = false; _this._lineOpacity = 1; _this._markerObject = new three.Object3D(); _this._markerObject.position.copy(_this.position); parentObject.add(_this._markerObject); _this._markerLineMaterial = new LineMaterial({ color: new three.Color(lineColor.rgb), opacity: lineColor.a, transparent: true, linewidth: lineWidth, depthTest: depthTest, vertexColors: false, dashed: false }); _this._markerLineMaterial.resolution.set(window.innerWidth, window.innerHeight); return _this; } var _proto = LineMarker.prototype; _proto.update = function update(markerData) { _Marker.prototype.update.call(this, markerData); if (markerData.lineColor) this.lineColor = markerData.lineColor; this.lineWidth = markerData.lineWidth ? parseFloat(markerData.lineWidth) : 2; this.depthTest = !!markerData.depthTest; var points = []; if (Array.isArray(markerData.line)) { markerData.line.forEach(function (point) { points.push(new three.Vector3(parseFloat(point.x), parseFloat(point.y), parseFloat(point.z))); }); } this.line = points; }; _proto._onBeforeRender = function _onBeforeRender(renderer, scene, camera) { _Marker.prototype._onBeforeRender.call(this, renderer, scene, camera); this._markerLineMaterial.opacity = this._lineOpacity * this._opacity; }; _proto.dispose = function dispose() { this._markerObject.parent.remove(this._markerObject); this._markerObject.children.forEach(function (child) { if (child.geometry && child.geometry.isGeometry) child.geometry.dispose(); }); this._markerObject.clear(); this._markerLineMaterial.dispose(); _Marker.prototype.dispose.call(this); } /** * Sets the line-color * * color-object format: *
	   * {
	   *     r: 0,    // int 0-255 red
	   *     g: 0,    // int 0-255 green
	   *     b: 0,    // int 0-255 blue
	   *     a: 0     // float 0-1 alpha
	   * }
	   * 
* * @param color {Object} */ ; _createClass(LineMarker, [{ key: "lineColor", set: function set(color) { color = Marker.normalizeColor(color); this._markerLineMaterial.color.setHex(color.rgb); this._lineOpacity = color.a; this._markerLineMaterial.needsUpdate = true; } /** * Sets the width of the marker-line * @param width {number} */ }, { key: "lineWidth", set: function set(width) { this._markerLineMaterial.linewidth = width; this._markerLineMaterial.needsUpdate = true; } /** * Sets if this marker can be seen through terrain * @param test {boolean} */ }, { key: "depthTest", set: function set(test) { this._markerLineMaterial.depthTest = test; this._markerLineMaterial.needsUpdate = true; }, get: function get() { return this._markerLineMaterial.depthTest; } /** * Sets the points for the shape of this marker. * @param points {Vector3[]} */ }, { key: "line", set: function set(points) { var _this2 = this; // remove old marker this._markerObject.children.forEach(function (child) { if (child.geometry && child.geometry.isGeometry) child.geometry.dispose(); }); this._markerObject.clear(); if (points.length < 3) return; this._markerObject.position.copy(this.position); // line var points3d = []; points.forEach(function (point) { return points3d.push(point.x, point.y, point.z); }); var lineGeo = new LineGeometry(); lineGeo.setPositions(points3d); lineGeo.translate(-this.position.x, -this.position.y, -this.position.z); var line = new Line2(lineGeo, this._markerLineMaterial); line.computeLineDistances(); line.onBeforeRender = function (renderer, camera, scene) { _this2._onBeforeRender(renderer, camera, scene); renderer.getSize(line.material.resolution); }; line.marker = this; this._markerObject.add(line); } }]); return LineMarker; }(Marker); var ExtrudeMarker = /*#__PURE__*/function (_Marker) { _inheritsLoose(ExtrudeMarker, _Marker); function ExtrudeMarker(markerSet, id, parentObject) { var _this; _this = _Marker.call(this, markerSet, id) || this; Object.defineProperty(_assertThisInitialized(_this), 'isExtrudeMarker', { value: true }); Object.defineProperty(_assertThisInitialized(_this), 'type', { value: "extrude" }); var fillColor = Marker.normalizeColor({}); var borderColor = Marker.normalizeColor({}); var lineWidth = 2; var depthTest = false; _this._lineOpacity = 1; _this._fillOpacity = 1; _this._markerObject = new three.Object3D(); _this._markerObject.position.copy(_this.position); parentObject.add(_this._markerObject); _this._markerFillMaterial = new three.ShaderMaterial({ vertexShader: MARKER_FILL_VERTEX_SHADER, fragmentShader: MARKER_FILL_FRAGMENT_SHADER, side: three.DoubleSide, depthTest: depthTest, transparent: true, uniforms: { markerColor: { value: fillColor.vec4 } } }); _this._markerLineMaterial = new LineMaterial({ color: new three.Color(borderColor.rgb), opacity: borderColor.a, transparent: true, linewidth: lineWidth, depthTest: depthTest, vertexColors: false, dashed: false }); _this._markerLineMaterial.resolution.set(window.innerWidth, window.innerHeight); return _this; } var _proto = ExtrudeMarker.prototype; _proto.update = function update(markerData) { _Marker.prototype.update.call(this, markerData); this.minHeight = markerData.minHeight ? parseFloat(markerData.minHeight) : 0.0; this.maxHeight = markerData.maxHeight ? parseFloat(markerData.maxHeight) : 255.0; this.depthTest = !!markerData.depthTest; if (markerData.fillColor) this.fillColor = markerData.fillColor; if (markerData.borderColor) this.borderColor = markerData.borderColor; this.lineWidth = markerData.lineWidth ? parseFloat(markerData.lineWidth) : 2; var points = []; if (Array.isArray(markerData.shape)) { markerData.shape.forEach(function (point) { points.push(new three.Vector2(parseFloat(point.x), parseFloat(point.z))); }); } this.shape = points; }; _proto._onBeforeRender = function _onBeforeRender(renderer, scene, camera) { _Marker.prototype._onBeforeRender.call(this, renderer, scene, camera); this._markerFillMaterial.uniforms.markerColor.value.w = this._fillOpacity * this._opacity; this._markerLineMaterial.opacity = this._lineOpacity * this._opacity; }; _proto.dispose = function dispose() { this._markerObject.parent.remove(this._markerObject); this._markerObject.children.forEach(function (child) { if (child.geometry && child.geometry.isGeometry) child.geometry.dispose(); }); this._markerObject.clear(); this._markerFillMaterial.dispose(); this._markerLineMaterial.dispose(); _Marker.prototype.dispose.call(this); } /** * Sets the fill-color * * color-object format: *
	   * {
	   *     r: 0,    // int 0-255 red
	   *     g: 0,    // int 0-255 green
	   *     b: 0,    // int 0-255 blue
	   *     a: 0     // float 0-1 alpha
	   * }
	   * 
* * @param color {Object} */ ; _createClass(ExtrudeMarker, [{ key: "fillColor", set: function set(color) { color = Marker.normalizeColor(color); this._markerFillMaterial.uniforms.markerColor.value.copy(color.vec4); this._fillOpacity = color.a; this._markerFillMaterial.needsUpdate = true; } /** * Sets the border-color * * color-object format: *
	     * {
	     *     r: 0,    // int 0-255 red
	     *     g: 0,    // int 0-255 green
	     *     b: 0,    // int 0-255 blue
	     *     a: 0     // float 0-1 alpha
	     * }
	     * 
* * @param color {Object} */ }, { key: "borderColor", set: function set(color) { color = Marker.normalizeColor(color); this._markerLineMaterial.color.setHex(color.rgb); this._lineOpacity = color.a; this._markerLineMaterial.needsUpdate = true; } /** * Sets the width of the marker-line * @param width {number} */ }, { key: "lineWidth", set: function set(width) { this._markerLineMaterial.linewidth = width; this._markerLineMaterial.needsUpdate = true; } /** * Sets if this marker can be seen through terrain * @param test {boolean} */ }, { key: "depthTest", set: function set(test) { this._markerFillMaterial.depthTest = test; this._markerFillMaterial.needsUpdate = true; this._markerLineMaterial.depthTest = test; this._markerLineMaterial.needsUpdate = true; }, get: function get() { return this._markerFillMaterial.depthTest; } /** * Sets the min-height of this marker * @param height {number} */ }, { key: "minHeight", set: function set(height) { this._minHeight = height; } /** * Sets the max-height of this marker * @param height {number} */ }, { key: "maxHeight", set: function set(height) { this._markerObject.position.y = height + 0.01; } /** * Sets the points for the shape of this marker. * @param points {Vector2[]} */ }, { key: "shape", set: function set(points) { var _this2 = this; // remove old marker this._markerObject.children.forEach(function (child) { if (child.geometry && child.geometry.isGeometry) child.geometry.dispose(); }); this._markerObject.clear(); if (points.length < 3) return; this._markerObject.position.x = this.position.x + 0.01; this._markerObject.position.z = this.position.z + 0.01; var maxY = this._markerObject.position.y; var minY = this._minHeight; var depth = maxY - minY; var shape = new three.Shape(points); // border-line if (this._markerLineMaterial.opacity > 0) { var points3d = []; points.forEach(function (point) { return points3d.push(point.x, 0, point.y); }); points3d.push(points[0].x, 0, points[0].y); var preRenderHook = function preRenderHook(line) { return function (renderer) { renderer.getSize(line.material.resolution); }; }; var topLineGeo = new LineGeometry(); topLineGeo.setPositions(points3d); topLineGeo.translate(-this.position.x, 0, -this.position.z); var topLine = new Line2(topLineGeo, this._markerLineMaterial); topLine.computeLineDistances(); topLine.onBeforeRender = preRenderHook(topLine); this._markerObject.add(topLine); var bottomLine = topLine.clone(); bottomLine.position.y = -depth; bottomLine.computeLineDistances(); bottomLine.onBeforeRender = preRenderHook(bottomLine); this._markerObject.add(bottomLine); points.forEach(function (point) { var pointLineGeo = new LineGeometry(); pointLineGeo.setPositions([point.x, 0, point.y, point.x, -depth, point.y]); pointLineGeo.translate(-_this2.position.x, 0, -_this2.position.z); var pointLine = new Line2(pointLineGeo, _this2._markerLineMaterial); pointLine.computeLineDistances(); pointLine.onBeforeRender = preRenderHook(pointLine); pointLine.marker = _this2; _this2._markerObject.add(pointLine); }); } // fill if (this._markerFillMaterial.uniforms.markerColor.value.w > 0) { var fillGeo = new three.ExtrudeBufferGeometry(shape, { steps: 1, depth: depth, bevelEnabled: false }); fillGeo.rotateX(Math.PI / 2); //make y to z fillGeo.translate(-this.position.x, 0, -this.position.z); var fill = new three.Mesh(fillGeo, this._markerFillMaterial); fill.onBeforeRender = function (renderer, scene, camera) { return _this2._onBeforeRender(renderer, scene, camera); }; fill.marker = this; this._markerObject.add(fill); } // put render-hook on line (only) if there is no fill else if (this._markerObject.children.length > 0) { var oldHook = this._markerObject.children[0].onBeforeRender; this._markerObject.children[0].onBeforeRender = function (renderer, scene, camera, geometry, material, group) { _this2._onBeforeRender(renderer, scene, camera); oldHook(renderer, scene, camera, geometry, material, group); }; } } }]); return ExtrudeMarker; }(Marker); /** * @author mrdoob / http://mrdoob.com/ * * adapted for bluemap's purposes */ var CSS2DObject = function CSS2DObject(element) { three.Object3D.call(this); this.element = element; this.element.style.position = 'absolute'; this.anchor = new three.Vector2(); this.addEventListener('removed', function () { this.traverse(function (object) { if (object.element instanceof Element && object.element.parentNode !== null) { object.element.parentNode.removeChild(object.element); } }); }); }; CSS2DObject.prototype = Object.create(three.Object3D.prototype); CSS2DObject.prototype.constructor = CSS2DObject; // var CSS2DRenderer = function CSS2DRenderer() { var _this = this; var _width, _height; var _widthHalf, _heightHalf; var vector = new three.Vector3(); var viewMatrix = new three.Matrix4(); var viewProjectionMatrix = new three.Matrix4(); var cache = { objects: new WeakMap() }; var domElement = document.createElement('div'); domElement.style.overflow = 'hidden'; this.domElement = domElement; this.getSize = function () { return { width: _width, height: _height }; }; this.setSize = function (width, height) { _width = width; _height = height; _widthHalf = _width / 2; _heightHalf = _height / 2; domElement.style.width = width + 'px'; domElement.style.height = height + 'px'; }; var renderObject = function renderObject(object, scene, camera) { if (object instanceof CSS2DObject) { object.onBeforeRender(_this, scene, camera); vector.setFromMatrixPosition(object.matrixWorld); vector.applyMatrix4(viewProjectionMatrix); var element = object.element; var style = 'translate(' + (vector.x * _widthHalf + _widthHalf - object.anchor.x) + 'px,' + (-vector.y * _heightHalf + _heightHalf - object.anchor.y) + 'px)'; element.style.WebkitTransform = style; element.style.MozTransform = style; element.style.oTransform = style; element.style.transform = style; element.style.display = object.visible && vector.z >= -1 && vector.z <= 1 ? '' : 'none'; var objectData = { distanceToCameraSquared: getDistanceToSquared(camera, object) }; cache.objects.set(object, objectData); if (element.parentNode !== domElement) { domElement.appendChild(element); } object.onAfterRender(_this, scene, camera); } for (var i = 0, l = object.children.length; i < l; i++) { renderObject(object.children[i], scene, camera); } }; var getDistanceToSquared = function () { var a = new three.Vector3(); var b = new three.Vector3(); return function (object1, object2) { a.setFromMatrixPosition(object1.matrixWorld); b.setFromMatrixPosition(object2.matrixWorld); return a.distanceToSquared(b); }; }(); var filterAndFlatten = function filterAndFlatten(scene) { var result = []; scene.traverse(function (object) { if (object instanceof CSS2DObject) result.push(object); }); return result; }; var zOrder = function zOrder(scene) { var sorted = filterAndFlatten(scene).sort(function (a, b) { var distanceA = cache.objects.get(a).distanceToCameraSquared; var distanceB = cache.objects.get(b).distanceToCameraSquared; return distanceA - distanceB; }); var zMax = sorted.length; for (var i = 0, l = sorted.length; i < l; i++) { sorted[i].element.style.zIndex = zMax - i; } }; this.render = function (scene, camera) { if (scene.autoUpdate === true) scene.updateMatrixWorld(); if (camera.parent === null) camera.updateMatrixWorld(); viewMatrix.copy(camera.matrixWorldInverse); viewProjectionMatrix.multiplyMatrices(camera.projectionMatrix, viewMatrix); renderObject(scene, scene, camera); zOrder(scene); }; }; var HTMLMarker = /*#__PURE__*/function (_Marker) { _inheritsLoose(HTMLMarker, _Marker); function HTMLMarker(markerSet, id, parentObject) { var _this; _this = _Marker.call(this, markerSet, id) || this; Object.defineProperty(_assertThisInitialized(_this), 'isHTMLMarker', { value: true }); Object.defineProperty(_assertThisInitialized(_this), 'type', { value: "html" }); _this._markerElement = htmlToElement("
"); _this._markerElement.addEventListener('click', function (event) { return _this.onClick(_this.position); }); _this._markerObject = new CSS2DObject(_this._markerElement); _this._markerObject.position.copy(_this.position); _this._markerObject.onBeforeRender = function (renderer, scene, camera) { return _this._onBeforeRender(renderer, scene, camera); }; parentObject.add(_this._markerObject); return _this; } var _proto = HTMLMarker.prototype; _proto.update = function update(markerData) { _Marker.prototype.update.call(this, markerData); if (markerData.html) { this.html = markerData.html; } if (markerData.anchor) { this.setAnchor(parseInt(markerData.anchor.x), parseInt(markerData.anchor.y)); } }; _proto._onBeforeRender = function _onBeforeRender(renderer, scene, camera) { _Marker.prototype._onBeforeRender.call(this, renderer, scene, camera); this._markerElement.style.opacity = this._opacity; this._markerElement.setAttribute("data-distance", Math.round(this._distance)); if (this._opacity <= 0) { this._markerElement.style.pointerEvents = "none"; } else { this._markerElement.style.pointerEvents = "auto"; } }; _proto.dispose = function dispose() { this._markerObject.parent.remove(this._markerObject); _Marker.prototype.dispose.call(this); }; _proto.setAnchor = function setAnchor(x, y) { this._markerObject.anchor.set(x, y); }; _proto.setPosition = function setPosition(x, y, z) { _Marker.prototype.setPosition.call(this, x, y, z); this._markerObject.position.set(x, y, z); }; _createClass(HTMLMarker, [{ key: "html", set: function set(html) { this._markerElement.innerHTML = html; } }]); return HTMLMarker; }(Marker); var POIMarker = /*#__PURE__*/function (_HTMLMarker) { _inheritsLoose(POIMarker, _HTMLMarker); function POIMarker(markerSet, id, parentObject) { var _this; _this = _HTMLMarker.call(this, markerSet, id, parentObject) || this; _this._markerElement.classList.add("bm-marker-poi"); Object.defineProperty(_assertThisInitialized(_this), 'isPOIMarker', { value: true }); return _this; } var _proto = POIMarker.prototype; _proto.update = function update(markerData) { _HTMLMarker.prototype.update.call(this, markerData); this.icon = markerData.icon ? markerData.icon : "assets/poi.svg"; //backwards compatibility for "iconAnchor" if (!markerData.anchor) { if (markerData.iconAnchor) { this.setAnchor(parseInt(markerData.iconAnchor.x), parseInt(markerData.iconAnchor.y)); } } }; _proto.onClick = function onClick(clickPosition) { var _this2 = this; if (!dispatchEvent(this.manager.events, 'bluemapMarkerClick', { marker: this })) return; this.followLink(); this._markerElement.classList.add("bm-marker-poi-show-label"); var onRemoveLabel = function onRemoveLabel() { _this2._markerElement.classList.remove("bm-marker-poi-show-label"); }; this.manager.events.addEventListener('bluemapPopupMarker', onRemoveLabel, { once: true }); setTimeout(function () { _this2.manager.events.addEventListener('bluemapCameraMoved', onRemoveLabel, { once: true }); }, 1000); }; _proto.updateHtml = function updateHtml() { var labelHtml = ''; if (this._label) labelHtml = "
" + this._label + "
"; this.html = "\"POI-"" + labelHtml; }; _createClass(POIMarker, [{ key: "label", set: function set(label) { this._label = label; this.updateHtml(); } }, { key: "icon", set: function set(icon) { this._icon = icon; this.updateHtml(); } }]); return POIMarker; }(HTMLMarker); var PlayerMarker = /*#__PURE__*/function (_HTMLMarker) { _inheritsLoose(PlayerMarker, _HTMLMarker); function PlayerMarker(markerSet, id, parentObject, playerUuid) { var _this; _this = _HTMLMarker.call(this, markerSet, id, parentObject) || this; _this._markerElement.classList.add("bm-marker-player"); Object.defineProperty(_assertThisInitialized(_this), 'isPlayerMarker', { value: true }); _this._name = id; _this._head = "assets/playerheads/steve.png"; _this.playerUuid = playerUuid; _this.updateHtml(); return _this; } var _proto = PlayerMarker.prototype; _proto.onClick = function onClick(clickPosition) { var _this2 = this; this.followLink(); this._markerElement.classList.add("bm-marker-poi-show-label"); var onRemoveLabel = function onRemoveLabel() { _this2._markerElement.classList.remove("bm-marker-poi-show-label"); }; this.manager.events.addEventListener('bluemapPopupMarker', onRemoveLabel, { once: true }); setTimeout(function () { _this2.manager.events.addEventListener('bluemapCameraMoved', onRemoveLabel, { once: true }); }, 1000); }; _proto.updateHtml = function updateHtml() { var labelHtml = ''; if (this._name) labelHtml = "
" + this._name + "
"; this.html = "\"PlayerHead-"" + labelHtml; }; _createClass(PlayerMarker, [{ key: "name", set: function set(name) { this._name = name; this.updateHtml(); } }, { key: "head", set: function set(headImage) { this._head = headImage; this.updateHtml(); } }]); return PlayerMarker; }(HTMLMarker); var MarkerSet = /*#__PURE__*/function () { function MarkerSet(manager, id, mapId, events) { if (events === void 0) { events = null; } Object.defineProperty(this, 'isMarkerSet', { value: true }); this.manager = manager; this.id = id; this._mapId = mapId; this._objectMarkerObject = new three.Object3D(); this._elementMarkerObject = new three.Object3D(); this.events = events; this.label = this.id; this.toggleable = true; this.defaultHide = false; this.visible = undefined; this._source = MarkerSet.Source.CUSTOM; this._marker = {}; } var _proto = MarkerSet.prototype; _proto.update = function update(markerSetData) { this._source = MarkerSet.Source.MARKER_FILE; this.label = markerSetData.label ? markerSetData.label : this.id; this.toggleable = markerSetData.toggleable !== undefined ? !!markerSetData.toggleable : true; this.defaultHide = !!markerSetData.defaultHide; if (this.visible === undefined) this.visible = this.defaultHide; var prevMarkers = this._marker; this._marker = {}; if (Array.isArray(markerSetData.marker)) { for (var _iterator = _createForOfIteratorHelperLoose(markerSetData.marker), _step; !(_step = _iterator()).done;) { var markerData = _step.value; var markerId = markerData.id; if (!markerId) continue; if (this._marker[markerId]) continue; // skip duplicate id's var mapId = markerData.map; if (mapId !== this._mapId) continue; this._marker[markerId] = prevMarkers[markerId]; delete prevMarkers[markerId]; this.updateMarker(markerId, markerData); } } //remaining (removed) markers for (var _markerId in prevMarkers) { if (!prevMarkers.hasOwnProperty(_markerId)) continue; if (!prevMarkers[_markerId] || !prevMarkers[_markerId].isMarker) continue; // keep markers that were not loaded from the marker-file if (prevMarkers[_markerId]._source !== Marker.Source.MARKER_FILE) { this._marker[_markerId] = prevMarkers[_markerId]; continue; } prevMarkers[_markerId].dispose(); } }; _proto.updateMarker = function updateMarker(markerId, markerData) { var markerType = markerData.type; if (!markerType) return; if (!this._marker[markerId] || !this._marker[markerId].isMarker) { this.createMarker(markerId, markerType); } else if (this._marker[markerId].type !== markerType) { this._marker[markerId].dispose(); this.createMarker(markerId, markerType); } if (!this._marker[markerId]) return; this._marker[markerId].update(markerData); }; _proto.createMarker = function createMarker(id, type) { switch (type) { case "html": this._marker[id] = new HTMLMarker(this, id, this._elementMarkerObject); break; case "poi": this._marker[id] = new POIMarker(this, id, this._elementMarkerObject); break; case "shape": this._marker[id] = new ShapeMarker(this, id, this._objectMarkerObject); break; case "line": this._marker[id] = new LineMarker(this, id, this._objectMarkerObject); break; case "extrude": this._marker[id] = new ExtrudeMarker(this, id, this._objectMarkerObject); break; default: return null; } return this._marker[id]; }; _proto.createPlayerMarker = function createPlayerMarker(playerUuid) { var id = playerUuid; this._marker[id] = new PlayerMarker(this, id, this._elementMarkerObject, playerUuid); return this._marker[id]; }; _proto.dispose = function dispose() { var marker = _extends({}, this._marker); for (var markerId in marker) { if (!marker.hasOwnProperty(markerId)) continue; if (!marker[markerId] || !marker[markerId].isMarker) continue; marker[markerId].dispose(); } this._marker = {}; delete this.manager.markerSets[this.id]; }; _createClass(MarkerSet, [{ key: "marker", get: function get() { return this._marker.values(); } }]); return MarkerSet; }(); MarkerSet.Source = { CUSTOM: 0, MARKER_FILE: 1 }; var MarkerManager = /*#__PURE__*/function () { function MarkerManager(markerFileUrl, mapId, events) { if (events === void 0) { events = null; } Object.defineProperty(this, 'isMarkerManager', { value: true }); this.markerFileUrl = markerFileUrl; this.mapId = mapId; this.events = events; this.markerSets = {}; this.objectMarkerScene = new three.Scene(); //3d markers this.elementMarkerScene = new three.Scene(); //html markers this._popupId = 0; } var _proto = MarkerManager.prototype; _proto.update = function update() { var _this = this; return this.loadMarkersFile().then(function (markersFile) { var prevMarkerSets = _this.markerSets; _this.markerSets = {}; if (Array.isArray(markersFile.markerSets)) { for (var _iterator = _createForOfIteratorHelperLoose(markersFile.markerSets), _step; !(_step = _iterator()).done;) { var markerSetData = _step.value; var markerSetId = markerSetData.id; if (!markerSetId) continue; if (_this.markerSets[markerSetId]) continue; // skip duplicate id's _this.markerSets[markerSetId] = prevMarkerSets[markerSetId]; delete prevMarkerSets[markerSetId]; _this.updateMarkerSet(markerSetId, markerSetData); } } //remaining (removed) markerSets for (var _markerSetId in prevMarkerSets) { if (!prevMarkerSets.hasOwnProperty(_markerSetId)) continue; if (!prevMarkerSets[_markerSetId] || !prevMarkerSets[_markerSetId].isMarkerSet) continue; // keep marker-sets that were not loaded from the marker-file if (prevMarkerSets[_markerSetId]._source !== MarkerSet.Source.MARKER_FILE) { _this.markerSets[_markerSetId] = prevMarkerSets[_markerSetId]; continue; } prevMarkerSets[_markerSetId].dispose(); } }).catch(function (reason) { alert(_this.events, reason, "warning"); }); }; _proto.updateMarkerSet = function updateMarkerSet(markerSetId, markerSetData) { if (!this.markerSets[markerSetId] || !this.markerSets[markerSetId].isMarkerSet) { this.createMarkerSet(markerSetId); this.objectMarkerScene.add(this.markerSets[markerSetId]._objectMarkerObject); this.elementMarkerScene.add(this.markerSets[markerSetId]._elementMarkerObject); } this.markerSets[markerSetId].update(markerSetData); }; _proto.createMarkerSet = function createMarkerSet(id) { this.markerSets[id] = new MarkerSet(this, id, this.mapId, this.events); return this.markerSets[id]; }; _proto.dispose = function dispose() { var sets = _extends({}, this.markerSets); for (var markerSetId in sets) { if (!sets.hasOwnProperty(markerSetId)) continue; if (!sets[markerSetId] || !sets[markerSetId].isMarkerSet) continue; sets[markerSetId].dispose(); } this.markerSets = {}; }; _proto.showPopup = function showPopup(html, x, y, z, autoRemove, onRemoval) { var _this2 = this; if (autoRemove === void 0) { autoRemove = true; } if (onRemoval === void 0) { onRemoval = null; } var marker = new HTMLMarker(this, "popup-" + this._popupId++, this.elementMarkerScene); marker.setPosition(x, y, z); marker.html = html; marker.onDisposal = onRemoval; dispatchEvent(this.events, 'bluemapPopupMarker', { marker: marker }); if (autoRemove) { var onRemove = function onRemove() { marker.blendOut(200, function (finished) { if (finished) marker.dispose(); }); }; this.events.addEventListener('bluemapPopupMarker', onRemove, { once: true }); setTimeout(function () { _this2.events.addEventListener('bluemapCameraMoved', onRemove, { once: true }); }, 1000); } marker.blendIn(200); return marker; } /** * Loads the markers.json file for this map * @returns {Promise} */ ; _proto.loadMarkersFile = function loadMarkersFile() { var _this3 = this; return new Promise(function (resolve, reject) { alert(_this3.events, "Loading markers from '" + _this3.markerFileUrl + "'...", "fine"); var loader = new three.FileLoader(); loader.setResponseType("json"); loader.load(_this3.markerFileUrl, function (markerFile) { if (!markerFile) reject("Failed to parse '" + _this3.markerFileUrl + "'!");else resolve(markerFile); }, function () {}, function () { return reject("Failed to load '" + _this3.markerFileUrl + "'!"); }); }); }; return MarkerManager; }(); var Map = /*#__PURE__*/function () { function Map(id, dataUrl, events) { var _this = this; if (events === void 0) { events = null; } this.onTileLoad = function (layer) { return function (tile) { dispatchEvent(_this.events, "bluemapMapTileLoaded", { tile: tile, layer: layer }); }; }; this.onTileUnload = function (layer) { return function (tile) { dispatchEvent(_this.events, "bluemapMapTileUnloaded", { tile: tile, layer: layer }); }; }; Object.defineProperty(this, 'isMap', { value: true }); this.id = id; this.events = events; this.dataUrl = dataUrl; this.name = this.id; this.world = "-"; this.startPos = { x: 0, z: 0 }; this.skyColor = { r: 0, g: 0, b: 0 }; this.ambientLight = 0; this.hires = { tileSize: { x: 32, z: 32 }, scale: { x: 1, z: 1 }, translate: { x: 2, z: 2 } }; this.lowres = { tileSize: { x: 32, z: 32 }, scale: { x: 1, z: 1 }, translate: { x: 2, z: 2 } }; this.scene = new three.Scene(); this.scene.autoUpdate = false; this.raycaster = new three.Raycaster(); this.hiresMaterial = null; this.lowresMaterial = null; this.loadedTextures = []; this.hiresTileManager = null; this.lowresTileManager = null; this.markerManager = new MarkerManager(this.dataUrl + "../markers.json", this.id, this.events); } /** * Loads textures and materials for this map so it is ready to load map-tiles * @returns {Promise} */ var _proto = Map.prototype; _proto.load = function load(hiresVertexShader, hiresFragmentShader, lowresVertexShader, lowresFragmentShader, uniforms) { var _this2 = this; this.unload(); var settingsFilePromise = this.loadSettingsFile(); var textureFilePromise = this.loadTexturesFile(); var markerUpdatePromise = this.markerManager.update(); this.lowresMaterial = this.createLowresMaterial(lowresVertexShader, lowresFragmentShader, uniforms); var settingsPromise = settingsFilePromise.then(function (worldSettings) { _this2.name = worldSettings.name ? worldSettings.name : _this2.name; _this2.world = worldSettings.world ? worldSettings.world : _this2.world; _this2.startPos = _extends({}, _this2.startPos, worldSettings.startPos); _this2.skyColor = _extends({}, _this2.skyColor, worldSettings.skyColor); _this2.ambientLight = worldSettings.ambientLight ? worldSettings.ambientLight : 0; if (worldSettings.hires === undefined) worldSettings.hires = {}; if (worldSettings.lowres === undefined) worldSettings.lowres = {}; _this2.hires = { tileSize: _extends({}, _this2.hires.tileSize, worldSettings.hires.tileSize), scale: _extends({}, _this2.hires.scale, worldSettings.hires.scale), translate: _extends({}, _this2.hires.translate, worldSettings.hires.translate) }; _this2.lowres = { tileSize: _extends({}, _this2.lowres.tileSize, worldSettings.lowres.tileSize), scale: _extends({}, _this2.lowres.scale, worldSettings.lowres.scale), translate: _extends({}, _this2.lowres.translate, worldSettings.lowres.translate) }; }); var mapPromise = Promise.all([settingsPromise, textureFilePromise]).then(function (values) { var textures = values[1]; if (textures === null) throw new Error("Failed to parse textures.json!"); _this2.hiresMaterial = _this2.createHiresMaterial(hiresVertexShader, hiresFragmentShader, uniforms, textures); _this2.hiresTileManager = new TileManager(_this2.scene, new TileLoader(_this2.dataUrl + "hires/", _this2.hiresMaterial, _this2.hires, 1), _this2.onTileLoad("hires"), _this2.onTileUnload("hires"), _this2.events); _this2.lowresTileManager = new TileManager(_this2.scene, new TileLoader(_this2.dataUrl + "lowres/", _this2.lowresMaterial, _this2.lowres, 2), _this2.onTileLoad("lowres"), _this2.onTileUnload("lowres"), _this2.events); alert(_this2.events, "Map '" + _this2.id + "' is loaded.", "fine"); }); return Promise.all([mapPromise, markerUpdatePromise]); }; _proto.loadMapArea = function loadMapArea(x, z, hiresViewDistance, lowresViewDistance) { if (!this.isLoaded) return; var hiresX = Math.floor((x - this.hires.translate.x) / this.hires.tileSize.x); var hiresZ = Math.floor((z - this.hires.translate.z) / this.hires.tileSize.z); var hiresViewX = Math.floor(hiresViewDistance / this.hires.tileSize.x); var hiresViewZ = Math.floor(hiresViewDistance / this.hires.tileSize.z); var lowresX = Math.floor((x - this.lowres.translate.x) / this.lowres.tileSize.x); var lowresZ = Math.floor((z - this.lowres.translate.z) / this.lowres.tileSize.z); var lowresViewX = Math.floor(lowresViewDistance / this.lowres.tileSize.x); var lowresViewZ = Math.floor(lowresViewDistance / this.lowres.tileSize.z); this.hiresTileManager.loadAroundTile(hiresX, hiresZ, hiresViewX, hiresViewZ); this.lowresTileManager.loadAroundTile(lowresX, lowresZ, lowresViewX, lowresViewZ); } /** * Loads the settings.json file for this map * @returns {Promise} */ ; _proto.loadSettingsFile = function loadSettingsFile() { var _this3 = this; return new Promise(function (resolve, reject) { alert(_this3.events, "Loading settings for map '" + _this3.id + "'...", "fine"); var loader = new three.FileLoader(); loader.setResponseType("json"); loader.load(_this3.dataUrl + "../settings.json", function (settings) { if (settings.maps && settings.maps[_this3.id]) { resolve(settings.maps[_this3.id]); } else { reject("the settings.json does not contain informations for map: " + _this3.id); } }, function () {}, function () { return reject("Failed to load the settings.json for map: " + _this3.id); }); }); } /** * Loads the textures.json file for this map * @returns {Promise} */ ; _proto.loadTexturesFile = function loadTexturesFile() { var _this4 = this; return new Promise(function (resolve, reject) { alert(_this4.events, "Loading textures for map '" + _this4.id + "'...", "fine"); var loader = new three.FileLoader(); loader.setResponseType("json"); loader.load(_this4.dataUrl + "../textures.json", resolve, function () {}, function () { return reject("Failed to load the textures.json for map: " + _this4.id); }); }); } /** * Creates a hires Material with the given textures * @param vertexShader * @param fragmentShader * @param uniforms * @param textures the textures * @returns {ShaderMaterial[]} the hires Material (array because its a multi-material) */ ; _proto.createHiresMaterial = function createHiresMaterial(vertexShader, fragmentShader, uniforms, textures) { var materials = []; if (!Array.isArray(textures.textures)) throw new Error("Invalid texture.json: 'textures' is not an array!"); for (var i = 0; i < textures.textures.length; i++) { var textureSettings = textures.textures[i]; var color = textureSettings.color; if (!Array.isArray(color) || color.length < 4) { color = [0, 0, 0, 0]; } var opaque = color[3] === 1; var transparent = !!textureSettings.transparent; var texture = new three.Texture(); texture.image = stringToImage(textureSettings.texture); texture.anisotropy = 1; texture.generateMipmaps = opaque || transparent; texture.magFilter = three.NearestFilter; texture.minFilter = texture.generateMipmaps ? three.NearestMipMapLinearFilter : three.NearestFilter; texture.wrapS = three.ClampToEdgeWrapping; texture.wrapT = three.ClampToEdgeWrapping; texture.flipY = false; texture.flatShading = true; texture.needsUpdate = true; this.loadedTextures.push(texture); var material = new three.ShaderMaterial({ uniforms: _extends({}, uniforms, { textureImage: { type: 't', value: texture } }), vertexShader: vertexShader, fragmentShader: fragmentShader, transparent: transparent, depthWrite: true, depthTest: true, vertexColors: three.VertexColors, side: three.FrontSide, wireframe: false }); material.needsUpdate = true; materials[i] = material; } return materials; } /** * Creates a lowres Material * @returns {ShaderMaterial} the hires Material */ ; _proto.createLowresMaterial = function createLowresMaterial(vertexShader, fragmentShader, uniforms) { return new three.ShaderMaterial({ uniforms: uniforms, vertexShader: vertexShader, fragmentShader: fragmentShader, transparent: false, depthWrite: true, depthTest: true, vertexColors: three.VertexColors, side: three.FrontSide, wireframe: false }); }; _proto.unload = function unload() { if (this.hiresTileManager) this.hiresTileManager.unload(); this.hiresTileManager = null; if (this.lowresTileManager) this.lowresTileManager.unload(); this.lowresTileManager = null; if (this.hiresMaterial) this.hiresMaterial.forEach(function (material) { return material.dispose(); }); this.hiresMaterial = null; if (this.lowresMaterial) this.lowresMaterial.dispose(); this.lowresMaterial = null; this.loadedTextures.forEach(function (texture) { return texture.dispose(); }); this.loadedTextures = []; this.markerManager.dispose(); } /** * Ray-traces and returns the terrain-height at a specific location, returns false if there is no map-tile loaded at that location * @param x * @param z * @returns {boolean|number} */ ; _proto.terrainHeightAt = function terrainHeightAt(x, z) { if (!this.isLoaded) return false; this.raycaster.set(new three.Vector3(x, 300, z), // ray-start new three.Vector3(0, -1, 0) // ray-direction ); this.raycaster.near = 1; this.raycaster.far = 300; this.raycaster.layers.enableAll(); var hiresTileHash = hashTile(Math.floor((x - this.hires.translate.x) / this.hires.tileSize.x), Math.floor((z - this.hires.translate.z) / this.hires.tileSize.z)); var tile = this.hiresTileManager.tiles[hiresTileHash]; if (!tile || !tile.model) { var lowresTileHash = hashTile(Math.floor((x - this.lowres.translate.x) / this.lowres.tileSize.x), Math.floor((z - this.lowres.translate.z) / this.lowres.tileSize.z)); tile = this.lowresTileManager.tiles[lowresTileHash]; } if (!tile || !tile.model) { return false; } try { var intersects = this.raycaster.intersectObjects([tile.model]); if (intersects.length > 0) { return intersects[0].point.y; } } catch (err) { return false; } }; _proto.dispose = function dispose() { this.unload(); }; _createClass(Map, [{ key: "isLoaded", get: function get() { return !!(this.hiresMaterial && this.lowresMaterial); } }]); return Map; }(); var SKY_FRAGMENT_SHADER = "\nuniform float sunlight;\nuniform float ambientLight;\nuniform vec3 skyColor;\n\nvarying vec3 vPosition;\n\nvoid main() {\n\tfloat horizonWidth = 0.005;\n\tfloat horizonHeight = 0.0;\n\t\n\tvec4 color = vec4(skyColor * max(sunlight, ambientLight), 1.0);\n\tfloat voidMultiplier = (clamp(vPosition.y - horizonHeight, -horizonWidth, horizonWidth) + horizonWidth) / (horizonWidth * 2.0);\n\tcolor.rgb *= voidMultiplier;\n\n\tgl_FragColor = color;\n}\n"; var SKY_VERTEX_SHADER = "\nvarying vec3 vPosition;\nvoid main() {\n\tvPosition = position;\n\t\n\tgl_Position = \n\t\tprojectionMatrix *\n\t\tmodelViewMatrix *\n\t\tvec4(position, 1);\n}\n"; var SkyboxScene = /*#__PURE__*/function (_Scene) { _inheritsLoose(SkyboxScene, _Scene); function SkyboxScene() { var _this; _this = _Scene.call(this) || this; _this.autoUpdate = false; Object.defineProperty(_assertThisInitialized(_this), 'isSkyboxScene', { value: true }); _this.UNIFORM_sunlight = { value: 1 }; _this.UNIFORM_skyColor = { value: new three.Vector3(0.5, 0.5, 1) }; _this.UNIFORM_ambientLight = { value: 0 }; var geometry = new three.SphereGeometry(1, 40, 5); var material = new three.ShaderMaterial({ uniforms: { sunlight: _this.UNIFORM_sunlight, skyColor: _this.UNIFORM_skyColor, ambientLight: _this.UNIFORM_ambientLight }, vertexShader: SKY_VERTEX_SHADER, fragmentShader: SKY_FRAGMENT_SHADER, side: three.BackSide }); var skybox = new three.Mesh(geometry, material); _this.add(skybox); return _this; } _createClass(SkyboxScene, [{ key: "sunlight", get: function get() { return this.UNIFORM_sunlight.value; }, set: function set(strength) { this.UNIFORM_sunlight.value = strength; } }, { key: "skyColor", get: function get() { return this.UNIFORM_skyColor.value; }, set: function set(color) { this.UNIFORM_skyColor.value = color; } }, { key: "ambientLight", get: function get() { return this.UNIFORM_ambientLight.value; }, set: function set(strength) { this.UNIFORM_ambientLight.value = strength; } }]); return SkyboxScene; }(three.Scene); var ControlsManager = /*#__PURE__*/function () { function ControlsManager(mapViewer, camera) { Object.defineProperty(this, 'isControlsManager', { value: true }); this.mapViewer = mapViewer; this.camera = camera; this.positionValue = new three.Vector3(0, 0, 0); this.rotationValue = 0; this.angleValue = 0; this.distanceValue = 500; this.orthoValue = 0; this.valueChanged = true; this.lastMapUpdatePosition = this.positionValue.clone(); this.controlsValue = null; this.updateCamera(); } var _proto = ControlsManager.prototype; _proto.update = function update(deltaTime, map) { if (deltaTime > 50) deltaTime = 50; // assume min 20 UPS if (this.controlsValue && typeof this.controlsValue.update === "function") this.controlsValue.update(deltaTime, map); }; _proto.updateCamera = function updateCamera() { if (this.valueChanged) { // prevent problems with the rotation when the angle is 0 (top-down) or distance is 0 (first-person) var rotatableAngle = this.angleValue; if (Math.abs(rotatableAngle) <= 0.0001) rotatableAngle = 0.0001; var rotatableDistance = this.distanceValue; if (Math.abs(rotatableDistance) <= 0.0001) rotatableDistance = -0.0001; // fix distance for ortho-effect if (this.orthoValue > 0) { rotatableDistance = three.MathUtils.lerp(rotatableDistance, Math.max(rotatableDistance, 300), Math.pow(this.orthoValue, 8)); } // calculate rotationVector var rotationVector = new three.Vector3(Math.sin(this.rotationValue), 0, -Math.cos(this.rotationValue)); // 0 is towards north var angleRotationAxis = new three.Vector3(0, 1, 0).cross(rotationVector); rotationVector.applyAxisAngle(angleRotationAxis, Math.PI / 2 - rotatableAngle); rotationVector.multiplyScalar(rotatableDistance); // position camera this.camera.position.copy(this.positionValue).sub(rotationVector); this.camera.lookAt(this.positionValue); // update ortho this.camera.distance = this.distanceValue; this.camera.ortho = this.orthoValue; // optimize far/near planes if (this.orthoValue <= 0) { var near = three.MathUtils.clamp(this.distanceValue / 1000, 0.01, 1); var far = three.MathUtils.clamp(this.distanceValue * 2, Math.max(near + 1, 2000), this.distanceValue + 5000); if (far - near > 10000) near = far - 10000; this.camera.near = near; this.camera.far = far; } else { this.camera.near = 1; this.camera.far = rotatableDistance + 300; } // event dispatchEvent(this.mapViewer.events, "bluemapCameraMoved", { controlsManager: this, camera: this.camera }); } // if the position changed, update map to show new position if (this.mapViewer.map) { var triggerDistance = 1; if (this.valueChanged) { triggerDistance = this.mapViewer.loadedHiresViewDistance * 0.8; } if (Math.abs(this.lastMapUpdatePosition.x - this.positionValue.x) >= triggerDistance || Math.abs(this.lastMapUpdatePosition.z - this.positionValue.z) >= triggerDistance) { this.lastMapUpdatePosition = this.positionValue.clone(); this.mapViewer.loadMapArea(this.positionValue.x, this.positionValue.z); } } this.valueChanged = false; }; _proto.handleValueChange = function handleValueChange() { this.valueChanged = true; }; _createClass(ControlsManager, [{ key: "x", get: function get() { return this.positionValue.x; }, set: function set(x) { this.positionValue.x = x; this.handleValueChange(); } }, { key: "y", get: function get() { return this.positionValue.y; }, set: function set(y) { this.positionValue.y = y; this.handleValueChange(); } }, { key: "z", get: function get() { return this.positionValue.z; }, set: function set(z) { this.positionValue.z = z; this.handleValueChange(); } }, { key: "position", get: function get() { return this.positionValue; }, set: function set(position) { this.position.copy(position); this.handleValueChange(); } }, { key: "rotation", get: function get() { return this.rotationValue; }, set: function set(rotation) { this.rotationValue = rotation; this.handleValueChange(); } }, { key: "angle", get: function get() { return this.angleValue; }, set: function set(angle) { this.angleValue = angle; this.handleValueChange(); } }, { key: "distance", get: function get() { return this.distanceValue; }, set: function set(distance) { this.distanceValue = distance; this.handleValueChange(); } }, { key: "ortho", get: function get() { return this.orthoValue; }, set: function set(ortho) { this.orthoValue = ortho; this.handleValueChange(); } }, { key: "controls", set: function set(controls) { if (this.controlsValue && typeof this.controlsValue.stop === "function") this.controlsValue.stop(); this.controlsValue = controls; if (this.controlsValue && typeof this.controlsValue.start === "function") this.controlsValue.start(this); }, get: function get() { return this.controlsValue; } }]); return ControlsManager; }(); var MapControls = /*#__PURE__*/function () { function MapControls(rootElement, hammerLib, events) { var _this = this; if (events === void 0) { events = null; } this.onKeyDown = function (evt) { var key = evt.key || evt.keyCode; for (var action in MapControls.KEYS) { if (!MapControls.KEYS.hasOwnProperty(action)) continue; if (MapControls.KEYS[action].includes(key)) { _this.keyStates[action] = true; } } }; this.onKeyUp = function (evt) { var key = evt.key || evt.keyCode; for (var action in MapControls.KEYS) { if (!MapControls.KEYS.hasOwnProperty(action)) continue; if (MapControls.KEYS[action].includes(key)) { _this.keyStates[action] = false; } } }; this.onWheel = function (evt) { var delta = evt.deltaY; if (evt.deltaMode === WheelEvent.DOM_DELTA_PIXEL) delta *= 0.01; if (evt.deltaMode === WheelEvent.DOM_DELTA_LINE) delta *= 0.33; _this.targetDistance *= Math.pow(1.5, delta); _this.updateZoom(); }; this.onMouseDown = function (evt) { if (_this.state !== MapControls.STATES.NONE) return; if (MapControls.BUTTONS.MOVE.includes(evt.button)) { _this.state = MapControls.STATES.MOVE; evt.preventDefault(); } if (MapControls.BUTTONS.ORBIT.includes(evt.button)) { _this.state = MapControls.STATES.ORBIT; evt.preventDefault(); } }; this.onMouseMove = function (evt) { _this.mouse.set(evt.clientX, evt.clientY); if (_this.state !== MapControls.STATES.NONE) { evt.preventDefault(); } }; this.onMouseUp = function (evt) { if (_this.state === MapControls.STATES.NONE) return; if (MapControls.BUTTONS.MOVE.includes(evt.button)) { if (_this.state === MapControls.STATES.MOVE) _this.state = MapControls.STATES.NONE; evt.preventDefault(); } if (MapControls.BUTTONS.ORBIT.includes(evt.button)) { if (_this.state === MapControls.STATES.ORBIT) _this.state = MapControls.STATES.NONE; evt.preventDefault(); } }; this.onTouchDown = function (evt) { if (evt.pointerType === "mouse") return; _this.touchStart.set(_this.targetPosition.x, _this.targetPosition.z); _this.state = MapControls.STATES.MOVE; }; this.onTouchMove = function (evt) { if (evt.pointerType === "mouse") return; if (_this.state !== MapControls.STATES.MOVE) return; var touchDelta = new three.Vector2(evt.deltaX, evt.deltaY); if (touchDelta.x !== 0 || touchDelta.y !== 0) { touchDelta.rotateAround(MapControls.VECTOR2_ZERO, _this.controls.rotation); _this.targetPosition.x = _this.touchStart.x - touchDelta.x * _this.targetDistance / _this.rootElement.clientHeight * 1.5; _this.targetPosition.z = _this.touchStart.y - touchDelta.y * _this.targetDistance / _this.rootElement.clientHeight * 1.5; } }; this.onTouchUp = function (evt) { if (evt.pointerType === "mouse") return; _this.state = MapControls.STATES.NONE; }; this.onTouchTiltDown = function () { _this.touchTiltStart = _this.targetAngle; _this.state = MapControls.STATES.ORBIT; }; this.onTouchTiltMove = function (evt) { if (_this.state !== MapControls.STATES.ORBIT) return; _this.targetAngle = _this.touchTiltStart - evt.deltaY / _this.rootElement.clientHeight * Math.PI; _this.targetAngle = three.MathUtils.clamp(_this.targetAngle, _this.minAngle, _this.maxAngleForZoom + 0.1); }; this.onTouchTiltUp = function () { _this.state = MapControls.STATES.NONE; }; this.onTouchRotateDown = function (evt) { _this.lastTouchRotation = evt.rotation; _this.state = MapControls.STATES.ORBIT; }; this.onTouchRotateMove = function (evt) { if (_this.state !== MapControls.STATES.ORBIT) return; var delta = evt.rotation - _this.lastTouchRotation; _this.lastTouchRotation = evt.rotation; if (delta > 180) delta -= 360; if (delta < -180) delta += 360; _this.targetRotation -= delta * (Math.PI / 180) * 1.4; _this.wrapRotation(); }; this.onTouchRotateUp = function () { _this.state = MapControls.STATES.NONE; }; this.onTouchZoomDown = function () { _this.touchZoomStart = _this.targetDistance; }; this.onTouchZoomMove = function (evt) { _this.targetDistance = _this.touchZoomStart / evt.scale; _this.updateZoom(); }; this.onContextMenu = function (evt) { evt.preventDefault(); }; Object.defineProperty(this, 'isMapControls', { value: true }); this.rootElement = rootElement; this.hammer = hammerLib; this.events = events; this.controls = null; this.targetPosition = new three.Vector3(); this.positionTerrainHeight = false; this.targetDistance = 400; this.minDistance = 10; this.maxDistance = 10000; this.targetRotation = 0; this.targetAngle = 0; this.minAngle = 0; this.maxAngle = Math.PI / 2; this.maxAngleForZoom = this.maxAngle; this.state = MapControls.STATES.NONE; this.mouse = new three.Vector2(); this.lastMouse = new three.Vector2(); this.keyStates = {}; this.touchStart = new three.Vector2(); this.touchTiltStart = 0; this.lastTouchRotation = 0; this.touchZoomStart = 0; } var _proto = MapControls.prototype; _proto.start = function start(controls) { this.controls = controls; this.targetPosition.copy(this.controls.position); this.positionTerrainHeight = false; this.targetDistance = this.controls.distance; this.targetDistance = three.MathUtils.clamp(this.targetDistance, this.minDistance, this.maxDistance); this.targetRotation = this.controls.rotation; this.targetAngle = this.controls.angle; this.updateZoom(); // add events this.rootElement.addEventListener("wheel", this.onWheel, { passive: true }); this.hammer.on('zoomstart', this.onTouchZoomDown); this.hammer.on('zoommove', this.onTouchZoomMove); this.rootElement.addEventListener('mousedown', this.onMouseDown); window.addEventListener('mousemove', this.onMouseMove); window.addEventListener('mouseup', this.onMouseUp); window.addEventListener('keydown', this.onKeyDown); window.addEventListener('keyup', this.onKeyUp); this.hammer.on('movestart', this.onTouchDown); this.hammer.on('movemove', this.onTouchMove); this.hammer.on('moveend', this.onTouchUp); this.hammer.on('movecancel', this.onTouchUp); this.hammer.on('tiltstart', this.onTouchTiltDown); this.hammer.on('tiltmove', this.onTouchTiltMove); this.hammer.on('tiltend', this.onTouchTiltUp); this.hammer.on('tiltcancel', this.onTouchTiltUp); this.hammer.on('rotatestart', this.onTouchRotateDown); this.hammer.on('rotatemove', this.onTouchRotateMove); this.hammer.on('rotateend', this.onTouchRotateUp); this.hammer.on('rotatecancel', this.onTouchRotateUp); window.addEventListener('contextmenu', this.onContextMenu); }; _proto.stop = function stop() { // remove events this.rootElement.removeEventListener("wheel", this.onWheel); this.hammer.off('zoomstart', this.onTouchZoomDown); this.hammer.off('zoommove', this.onTouchZoomMove); this.rootElement.addEventListener('mousedown', this.onMouseDown); window.removeEventListener('mousemove', this.onMouseMove); window.removeEventListener('mouseup', this.onMouseUp); window.removeEventListener('keydown', this.onKeyDown); window.removeEventListener('keyup', this.onKeyUp); this.hammer.on('movestart', this.onTouchDown); this.hammer.off('movemove', this.onTouchMove); this.hammer.off('moveend', this.onTouchUp); this.hammer.off('movecancel', this.onTouchUp); this.hammer.off('tiltstart', this.onTouchTiltDown); this.hammer.off('tiltmove', this.onTouchTiltMove); this.hammer.off('tiltend', this.onTouchTiltUp); this.hammer.off('tiltcancel', this.onTouchTiltUp); this.hammer.off('rotatestart', this.onTouchRotateDown); this.hammer.off('rotatemove', this.onTouchRotateMove); this.hammer.off('rotateend', this.onTouchRotateUp); this.hammer.off('rotatecancel', this.onTouchRotateUp); window.removeEventListener('contextmenu', this.onContextMenu); }; _proto.update = function update(deltaTime, map) { // == process mouse movements == var deltaMouse = this.lastMouse.clone().sub(this.mouse); var moveDelta = new three.Vector2(); // zoom keys if (this.keyStates.ZOOM_IN) { this.targetDistance *= 1 - 0.003 * deltaTime; this.updateZoom(); } if (this.keyStates.ZOOM_OUT) { this.targetDistance *= 1 + 0.003 * deltaTime; this.updateZoom(); } // move if (this.state === MapControls.STATES.MOVE) { moveDelta.copy(deltaMouse); } else { if (this.keyStates.UP) moveDelta.y -= 20; if (this.keyStates.DOWN) moveDelta.y += 20; if (this.keyStates.LEFT) moveDelta.x -= 20; if (this.keyStates.RIGHT) moveDelta.x += 20; } if (moveDelta.x !== 0 || moveDelta.y !== 0) { moveDelta.rotateAround(MapControls.VECTOR2_ZERO, this.controls.rotation); this.targetPosition.set(this.targetPosition.x + moveDelta.x * this.targetDistance / this.rootElement.clientHeight * 1.5, this.targetPosition.y, this.targetPosition.z + moveDelta.y * this.targetDistance / this.rootElement.clientHeight * 1.5); this.updatePositionTerrainHeight(map); } else if (!this.positionTerrainHeight) { this.updatePositionTerrainHeight(map); } // tilt/pan if (this.state === MapControls.STATES.ORBIT) { if (deltaMouse.x !== 0) { this.targetRotation -= deltaMouse.x / this.rootElement.clientHeight * Math.PI; this.wrapRotation(); } if (deltaMouse.y !== 0) { this.targetAngle += deltaMouse.y / this.rootElement.clientHeight * Math.PI; this.targetAngle = three.MathUtils.clamp(this.targetAngle, this.minAngle, this.maxAngleForZoom + 0.1); } } if (this.targetAngle > this.maxAngleForZoom) this.targetAngle -= (this.targetAngle - this.maxAngleForZoom) * 0.3; // == Smoothly apply target values == var somethingChanged = false; // move var deltaPosition = this.targetPosition.clone().sub(this.controls.position); if (Math.abs(deltaPosition.x) > 0.01 || Math.abs(deltaPosition.y) > 0.001 || Math.abs(deltaPosition.z) > 0.01) { this.controls.position = this.controls.position.add(deltaPosition.multiplyScalar(0.015 * deltaTime)); somethingChanged = true; } // rotation var deltaRotation = this.targetRotation - this.controls.rotation; if (Math.abs(deltaRotation) > 0.0001) { this.controls.rotation += deltaRotation * 0.015 * deltaTime; somethingChanged = true; } // angle var deltaAngle = this.targetAngle - this.controls.angle; if (Math.abs(deltaAngle) > 0.0001) { this.controls.angle += deltaAngle * 0.015 * deltaTime; somethingChanged = true; } // zoom var deltaDistance = this.targetDistance - this.controls.distance; if (Math.abs(deltaDistance) > 0.001) { this.controls.distance += deltaDistance * 0.01 * deltaTime; somethingChanged = true; } // == Adjust camera height to terrain == if (somethingChanged) { var y = 0; if (this.positionTerrainHeight !== false) { y = this.targetPosition.y; var deltaY = this.positionTerrainHeight - y; if (Math.abs(deltaY) > 0.001) { y += deltaY * 0.01 * deltaTime; } } var minCameraHeight = map.terrainHeightAt(this.controls.camera.position.x, this.controls.camera.position.z) + (this.minDistance - this.targetDistance) * 0.4 + 1; if (minCameraHeight > y) y = minCameraHeight; this.targetPosition.y = y; } // == Fix NaN's as a fail-safe == if (isNaN(this.targetPosition.x)) { alert(this.events, "Invalid targetPosition x: " + this.targetPosition.x, "warning"); this.targetPosition.x = 0; } if (isNaN(this.targetPosition.y)) { alert(this.events, "Invalid targetPosition y: " + this.targetPosition.y, "warning"); this.targetPosition.y = 0; } if (isNaN(this.targetPosition.z)) { alert(this.events, "Invalid targetPosition z: " + this.targetPosition.z, "warning"); this.targetPosition.z = 0; } if (isNaN(this.targetDistance)) { alert(this.events, "Invalid targetDistance: " + this.targetDistance, "warning"); this.targetDistance = this.minDistance; } if (isNaN(this.targetRotation)) { alert(this.events, "Invalid targetRotation: " + this.targetRotation, "warning"); this.targetRotation = 0; } if (isNaN(this.targetAngle)) { alert(this.events, "Invalid targetAngle: " + this.targetAngle, "warning"); this.targetAngle = this.minAngle; } // == Remember last processed state == this.lastMouse.copy(this.mouse); }; _proto.updateZoom = function updateZoom() { this.targetDistance = three.MathUtils.clamp(this.targetDistance, this.minDistance, this.maxDistance); this.updateMaxAngleForZoom(); this.targetAngle = three.MathUtils.clamp(this.targetAngle, this.minAngle, this.maxAngleForZoom); }; _proto.updateMaxAngleForZoom = function updateMaxAngleForZoom() { this.maxAngleForZoom = three.MathUtils.clamp((1 - Math.pow((this.targetDistance - this.minDistance) / (500 - this.minDistance), 0.5)) * this.maxAngle, this.minAngle, this.maxAngle); }; _proto.updatePositionTerrainHeight = function updatePositionTerrainHeight(map) { this.positionTerrainHeight = map.terrainHeightAt(this.targetPosition.x, this.targetPosition.z); }; _proto.wrapRotation = function wrapRotation() { while (this.targetRotation >= Math.PI) { this.targetRotation -= Math.PI * 2; this.controls.rotation -= Math.PI * 2; } while (this.targetRotation <= -Math.PI) { this.targetRotation += Math.PI * 2; this.controls.rotation += Math.PI * 2; } }; return MapControls; }(); MapControls.STATES = { NONE: 0, MOVE: 1, ORBIT: 2 }; MapControls.KEYS = { LEFT: ["ArrowLeft", "a", "A", 37, 65], UP: ["ArrowUp", "w", "W", 38, 87], RIGHT: ["ArrowRight", "d", "D", 39, 68], DOWN: ["ArrowDown", "s", "S", 40, 83], ZOOM_IN: ["+"], ZOOM_OUT: ["-"] }; MapControls.BUTTONS = { ORBIT: [three.MOUSE.RIGHT], MOVE: [three.MOUSE.LEFT] }; MapControls.VECTOR2_ZERO = new three.Vector2(0, 0); /** * Taken from https://github.com/mrdoob/three.js/blob/master/examples/jsm/libs/stats.module.js */ var Stats = function Stats() { var mode = 0; var container = document.createElement('div'); container.style.cssText = 'position:absolute;bottom:5px;right:5px;cursor:pointer;opacity:0.9;z-index:10000'; container.addEventListener('click', function (event) { event.preventDefault(); showPanel(++mode % container.children.length); }, false); // function addPanel(panel) { container.appendChild(panel.dom); return panel; } function showPanel(id) { for (var i = 0; i < container.children.length; i++) { container.children[i].style.display = i === id ? 'block' : 'none'; } mode = id; } function hide() { showPanel(-1); } // var beginTime = (performance || Date).now(), prevTime = beginTime, frames = 0; var prevFrameTime = beginTime; var fpsPanel = addPanel(new Stats.Panel('FPS', '#0ff', '#002')); var msPanel = addPanel(new Stats.Panel('MS (render)', '#0f0', '#020')); var lastFrameMsPanel = addPanel(new Stats.Panel('MS (all)', '#f80', '#210')); var memPanel = null; if (self.performance && self.performance.memory) { memPanel = addPanel(new Stats.Panel('MB', '#f08', '#201')); } showPanel(0); return { REVISION: 16, dom: container, addPanel: addPanel, showPanel: showPanel, hide: hide, begin: function begin() { beginTime = (performance || Date).now(); }, end: function end() { frames++; var time = (performance || Date).now(); msPanel.update(time - beginTime, 200); lastFrameMsPanel.update(time - prevFrameTime, 200); if (time >= prevTime + 1000) { fpsPanel.update(frames * 1000 / (time - prevTime), 100); prevTime = time; frames = 0; if (memPanel) { var memory = performance.memory; memPanel.update(memory.usedJSHeapSize / 1048576, memory.jsHeapSizeLimit / 1048576); } } return time; }, update: function update() { beginTime = this.end(); prevFrameTime = beginTime; }, // Backwards Compatibility domElement: container, setMode: showPanel }; }; Stats.Panel = function (name, fg, bg) { var min = Infinity, max = 0, round = Math.round; var PR = round(window.devicePixelRatio || 1); var WIDTH = 160 * PR, HEIGHT = 96 * PR, TEXT_X = 3 * PR, TEXT_Y = 3 * PR, GRAPH_X = 3 * PR, GRAPH_Y = 15 * PR, GRAPH_WIDTH = 154 * PR, GRAPH_HEIGHT = 77 * PR; var canvas = document.createElement('canvas'); canvas.width = WIDTH; canvas.height = HEIGHT; canvas.style.cssText = 'width:160px;height:96px'; var context = canvas.getContext('2d'); context.font = 'bold ' + 9 * PR + 'px Helvetica,Arial,sans-serif'; context.textBaseline = 'top'; context.fillStyle = bg; context.fillRect(0, 0, WIDTH, HEIGHT); context.fillStyle = fg; context.fillText(name, TEXT_X, TEXT_Y); context.fillRect(GRAPH_X, GRAPH_Y, GRAPH_WIDTH, GRAPH_HEIGHT); context.fillStyle = bg; context.globalAlpha = 0.9; context.fillRect(GRAPH_X, GRAPH_Y, GRAPH_WIDTH, GRAPH_HEIGHT); return { dom: canvas, update: function update(value, maxValue) { min = Math.min(min, value); max = Math.max(max, value); context.fillStyle = bg; context.globalAlpha = 1; context.fillRect(0, 0, WIDTH, GRAPH_Y); context.fillStyle = fg; context.fillText(round(value) + ' ' + name + ' (' + round(min) + '-' + round(max) + ')', TEXT_X, TEXT_Y); context.drawImage(canvas, GRAPH_X + PR, GRAPH_Y, GRAPH_WIDTH - PR, GRAPH_HEIGHT, GRAPH_X, GRAPH_Y, GRAPH_WIDTH - PR, GRAPH_HEIGHT); context.fillRect(GRAPH_X + GRAPH_WIDTH - PR, GRAPH_Y, PR, GRAPH_HEIGHT); context.fillStyle = bg; context.globalAlpha = 0.9; context.fillRect(GRAPH_X + GRAPH_WIDTH - PR, GRAPH_Y, PR, round((1 - value / maxValue) * GRAPH_HEIGHT)); } }; }; /* * This file is part of BlueMap, licensed under the MIT License (MIT). * * Copyright (c) Blue (Lukas Rieger) * Copyright (c) contributors * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the 'Software'), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ var HIRES_VERTEX_SHADER = "\n#include \n" + three.ShaderChunk.logdepthbuf_pars_vertex + "\n\nattribute float ao;\nattribute float sunlight;\nattribute float blocklight;\n\nvarying vec3 vPosition;\nvarying vec3 vWorldPosition;\nvarying vec3 vNormal;\nvarying vec2 vUv;\nvarying vec3 vColor;\nvarying float vAo;\nvarying float vSunlight;\nvarying float vBlocklight;\n\nvoid main() {\n\tvPosition = position;\n\tvWorldPosition = (modelMatrix * vec4(position, 1)).xyz;\n\tvNormal = normal;\n\tvUv = uv;\n\tvColor = color;\n\tvAo = ao;\n\tvSunlight = sunlight;\n\tvBlocklight = blocklight;\n\t\n\tgl_Position = \n\t\tprojectionMatrix *\n\t\tviewMatrix *\n\t\tmodelMatrix *\n\t\tvec4(position, 1);\n\t\n\t" + three.ShaderChunk.logdepthbuf_vertex + " \n}\n"; /* * This file is part of BlueMap, licensed under the MIT License (MIT). * * Copyright (c) Blue (Lukas Rieger) * Copyright (c) contributors * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the 'Software'), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ var HIRES_FRAGMENT_SHADER = "\n" + three.ShaderChunk.logdepthbuf_pars_fragment + "\n\nuniform sampler2D textureImage;\nuniform float sunlightStrength;\nuniform float ambientLight;\n\nvarying vec3 vPosition;\nvarying vec3 vWorldPosition;\nvarying vec3 vNormal;\nvarying vec2 vUv;\nvarying vec3 vColor;\nvarying float vAo;\nvarying float vSunlight;\nvarying float vBlocklight;\n\nvoid main() {\n\tvec4 color = texture(textureImage, vUv);\n\tif (color.a == 0.0) discard;\n\t\n\t//apply vertex-color\n\tcolor.rgb *= vColor.rgb;\n\n\t//apply ao\n\tcolor.rgb *= vAo;\n\t\n\t//apply light\n\tfloat light = mix(vBlocklight, max(vSunlight, vBlocklight), sunlightStrength);\n\tcolor.rgb *= mix(ambientLight, 1.0, light / 15.0);\n\t\n\tgl_FragColor = color;\n\t\n\t" + three.ShaderChunk.logdepthbuf_fragment + "\n}\n"; /* * This file is part of BlueMap, licensed under the MIT License (MIT). * * Copyright (c) Blue (Lukas Rieger) * Copyright (c) contributors * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the 'Software'), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ var LOWRES_VERTEX_SHADER = "\n#include \n" + three.ShaderChunk.logdepthbuf_pars_vertex + "\n\nvarying vec3 vPosition;\nvarying vec3 vWorldPosition;\nvarying vec3 vNormal;\nvarying vec2 vUv;\nvarying vec3 vColor;\n\nvoid main() {\n\tvPosition = position;\n\tvWorldPosition = (modelMatrix * vec4(position, 1)).xyz;\n\tvNormal = normal;\n\tvUv = uv;\n\tvColor = color;\n\t\n\tgl_Position = \n\t\tprojectionMatrix *\n\t\tviewMatrix *\n\t\tmodelMatrix *\n\t\tvec4(position, 1);\n\t\t\n\t" + three.ShaderChunk.logdepthbuf_vertex + "\n}\n"; /* * This file is part of BlueMap, licensed under the MIT License (MIT). * * Copyright (c) Blue (Lukas Rieger) * Copyright (c) contributors * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the 'Software'), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ var LOWRES_FRAGMENT_SHADER = "\n" + three.ShaderChunk.logdepthbuf_pars_fragment + "\n\nstruct TileMap {\n\tsampler2D map;\n\tfloat size;\n\tvec2 scale;\n\tvec2 translate;\n\tvec2 pos; \n};\n\nuniform float sunlightStrength;\nuniform float ambientLight;\nuniform TileMap hiresTileMap;\n\nvarying vec3 vPosition;\nvarying vec3 vWorldPosition;\nvarying vec3 vNormal;\nvarying vec2 vUv;\nvarying vec3 vColor;\n\nvoid main() {\n\tfloat depth = gl_FragCoord.z / gl_FragCoord.w;\n\n\t//discard if hires tile is loaded at that position\n\tif (!isOrthographic && depth < 1900.0 && texture(hiresTileMap.map, ((vWorldPosition.xz - hiresTileMap.translate) / hiresTileMap.scale - hiresTileMap.pos) / hiresTileMap.size + 0.5).r >= 1.0) discard;\n\t\n\tvec4 color = vec4(vColor, 1.0);\n\n\tfloat diff = sqrt(max(dot(vNormal, vec3(0.3637, 0.7274, 0.5819)), 0.0)) * 0.4 + 0.6;\n\tcolor *= diff;\n\n\tcolor *= mix(sunlightStrength, 1.0, ambientLight);\n\n\tgl_FragColor = color;\n\t\n\t" + three.ShaderChunk.logdepthbuf_fragment + "\n}\n"; var CombinedCamera = /*#__PURE__*/function (_PerspectiveCamera) { _inheritsLoose(CombinedCamera, _PerspectiveCamera); function CombinedCamera(fov, aspect, near, far, ortho) { var _this; _this = _PerspectiveCamera.call(this, fov, aspect, near, far) || this; _this.ortho = ortho; _this.distance = 1; return _this; } var _proto = CombinedCamera.prototype; _proto.updateProjectionMatrix = function updateProjectionMatrix() { if (!this.ortographicProjection) this.ortographicProjection = new three.Matrix4(); if (!this.perspectiveProjection) this.perspectiveProjection = new three.Matrix4(); //copied from PerspectiveCamera var near = this.near; var top = near * Math.tan(three.MathUtils.DEG2RAD * 0.5 * this.fov) / this.zoom; var height = 2 * top; var width = this.aspect * height; var left = -0.5 * width; var view = this.view; if (this.view !== null && this.view.enabled) { var fullWidth = view.fullWidth, fullHeight = view.fullHeight; left += view.offsetX * width / fullWidth; top -= view.offsetY * height / fullHeight; width *= view.width / fullWidth; height *= view.height / fullHeight; } var skew = this.filmOffset; if (skew !== 0) left += near * skew / this.getFilmWidth(); // this part different to PerspectiveCamera var normalizedOrtho = -Math.pow(this.ortho - 1, 4) + 1; var orthoTop = this.distance * Math.tan(three.MathUtils.DEG2RAD * 0.5 * this.fov) / this.zoom; var orthoHeight = 2 * orthoTop; var orthoWidth = this.aspect * orthoHeight; var orthoLeft = -0.5 * orthoWidth; this.perspectiveProjection.makePerspective(left, left + width, top, top - height, near, this.far); this.ortographicProjection.makeOrthographic(orthoLeft, orthoLeft + orthoWidth, orthoTop, orthoTop - orthoHeight, near, this.far); for (var i = 0; i < 16; i++) { this.projectionMatrix.elements[i] = this.perspectiveProjection.elements[i] * (1 - normalizedOrtho) + this.ortographicProjection.elements[i] * normalizedOrtho; } // to here this.projectionMatrixInverse.copy(this.projectionMatrix).invert(); }; _createClass(CombinedCamera, [{ key: "isPerspectiveCamera", get: function get() { return this.ortho < 1; } }, { key: "isOrthographicCamera", get: function get() { return !this.isPerspectiveCamera; } }, { key: "type", get: function get() { return this.isPerspectiveCamera ? 'PerspectiveCamera' : 'OrthographicCamera'; }, set: function set(type) {//ignore } }]); return CombinedCamera; }(three.PerspectiveCamera); var MapViewer = /*#__PURE__*/function () { function MapViewer(element, dataUrl, liveApiUrl, events) { var _this = this; if (dataUrl === void 0) { dataUrl = "data/"; } if (liveApiUrl === void 0) { liveApiUrl = "live/"; } if (events === void 0) { events = element; } this.handleContainerResize = function () { _this.renderer.setSize(_this.rootElement.clientWidth, _this.rootElement.clientHeight); _this.renderer.setPixelRatio(window.devicePixelRatio * _this.superSamplingValue); _this.css2dRenderer.setSize(_this.rootElement.clientWidth, _this.rootElement.clientHeight); _this.camera.aspect = _this.rootElement.clientWidth / _this.rootElement.clientHeight; _this.camera.updateProjectionMatrix(); }; this.updateLoadedMapArea = function () { if (!_this.map) return; _this.map.loadMapArea(_this.loadedCenter.x, _this.loadedCenter.y, _this.loadedHiresViewDistance, _this.loadedLowresViewDistance); }; this.renderLoop = function (now) { requestAnimationFrame(_this.renderLoop); // calculate delta time if (_this.lastFrame <= 0) { _this.lastFrame = now; } var delta = now - _this.lastFrame; _this.lastFrame = now; // update stats _this.stats.begin(); // update controls if (_this.map != null) { _this.controlsManager.update(delta, _this.map); _this.controlsManager.updateCamera(); } // render _this.render(delta); // update stats _this.stats.update(); }; Object.defineProperty(this, 'isMapViewer', { value: true }); this.rootElement = element; this.events = events; this.dataUrl = dataUrl; this.liveApiUrl = liveApiUrl; this.stats = new Stats(); this.stats.hide(); this.superSamplingValue = 1; this.loadedCenter = new three.Vector2(0, 0); this.loadedHiresViewDistance = 200; this.loadedLowresViewDistance = 2000; // uniforms this.uniforms = { sunlightStrength: { value: 1 }, ambientLight: { value: 0 }, hiresTileMap: { value: { map: null, size: TileManager.tileMapSize, scale: new three.Vector2(1, 1), translate: new three.Vector2(), pos: new three.Vector2() } } }; // renderer this.renderer = new three.WebGLRenderer({ antialias: true, sortObjects: true, preserveDrawingBuffer: true, logarithmicDepthBuffer: true }); this.renderer.autoClear = false; this.renderer.uniforms = this.uniforms; // CSS2D renderer this.css2dRenderer = new CSS2DRenderer(); this.skyboxScene = new SkyboxScene(); this.camera = new CombinedCamera(75, 1, 0.1, 10000, 0); this.skyboxCamera = new three.PerspectiveCamera(75, 1, 0.1, 10000); this.hammer = new Hammer.Manager(this.rootElement); this.initializeHammer(); this.controlsManager = new ControlsManager(this, this.camera); this.controlsManager.controls = new MapControls(this.rootElement, this.hammer, this.events); this.raycaster = new three.Raycaster(); this.raycaster.layers.enableAll(); this.raycaster.params.Line2 = { threshold: 20 }; this.map = null; this.lastFrame = 0; // initialize this.initializeRootElement(); // handle some events window.addEventListener("resize", this.handleContainerResize); // start render-loop requestAnimationFrame(this.renderLoop); } var _proto = MapViewer.prototype; _proto.initializeHammer = function initializeHammer() { var touchTap = new Hammer.Tap({ event: 'tap', pointers: 1, taps: 1, threshold: 2 }); var touchMove = new Hammer.Pan({ event: 'move', direction: Hammer.DIRECTION_ALL, threshold: 0 }); var touchTilt = new Hammer.Pan({ event: 'tilt', direction: Hammer.DIRECTION_VERTICAL, pointers: 2, threshold: 0 }); var touchRotate = new Hammer.Rotate({ event: 'rotate', pointers: 2, threshold: 10 }); var touchZoom = new Hammer.Pinch({ event: 'zoom', pointers: 2, threshold: 0 }); touchTilt.recognizeWith(touchRotate); touchTilt.recognizeWith(touchZoom); touchRotate.recognizeWith(touchZoom); this.hammer.add(touchTap); this.hammer.add(touchMove); this.hammer.add(touchTilt); this.hammer.add(touchRotate); this.hammer.add(touchZoom); } /** * Initializes the root-element */ ; _proto.initializeRootElement = function initializeRootElement() { var _this2 = this; this.rootElement.innerHTML = ""; var outerDiv = htmlToElement("
"); this.rootElement.appendChild(outerDiv); /*this.rootElement.addEventListener('click', event => { let rootOffset = elementOffset(this.rootElement); this.handleMapInteraction(new Vector2( ((event.pageX - rootOffset.top) / this.rootElement.clientWidth) * 2 - 1, -((event.pageY - rootOffset.left) / this.rootElement.clientHeight) * 2 + 1 )); });*/ this.hammer.on('tap', function (event) { var rootOffset = elementOffset(_this2.rootElement); _this2.handleMapInteraction(new three.Vector2((event.center.x - rootOffset.top) / _this2.rootElement.clientWidth * 2 - 1, -((event.center.y - rootOffset.left) / _this2.rootElement.clientHeight) * 2 + 1)); }); // 3d-canvas outerDiv.appendChild(this.renderer.domElement); // html-markers this.css2dRenderer.domElement.style.position = 'absolute'; this.css2dRenderer.domElement.style.top = '0'; this.css2dRenderer.domElement.style.left = '0'; this.css2dRenderer.domElement.style.pointerEvents = 'none'; outerDiv.appendChild(this.css2dRenderer.domElement); // performance monitor outerDiv.appendChild(this.stats.dom); this.handleContainerResize(); } /** * Updates the render-resolution and aspect ratio based on the size of the root-element */ ; _proto.handleMapInteraction = function handleMapInteraction(screenPos, interactionType) { if (interactionType === void 0) { interactionType = MapViewer.InteractionType.LEFTCLICK; } if (this.map && this.map.isLoaded) { this.raycaster.setFromCamera(screenPos, this.camera); var lowresLayer = new three.Layers(); lowresLayer.set(2); // check marker interactions var intersects = this.raycaster.intersectObjects([this.map.scene, this.map.markerManager.objectMarkerScene], true); var covered = false; for (var i = 0; i < intersects.length; i++) { if (intersects[0].object) { var marker = intersects[i].object.marker; if (marker && marker._opacity > 0 && (!covered || !marker.depthTest)) { marker.onClick(intersects[i].pointOnLine || intersects[i].point); return; } else if (!intersects[i].object.layers.test(lowresLayer)) { covered = true; } } } } }; /** * Renders a frame */ _proto.render = function render(delta) { dispatchEvent(this.events, "bluemapRenderFrame", { delta: delta }); //prepare camera this.camera.updateProjectionMatrix(); this.skyboxCamera.rotation.copy(this.camera.rotation); this.skyboxCamera.updateProjectionMatrix(); //render this.renderer.clear(); this.renderer.render(this.skyboxScene, this.skyboxCamera); this.renderer.clearDepth(); /* Layers: 0 - always visible objects 1 - hires layer 2 - lowres layer */ if (this.map && this.map.isLoaded) { //update uniforms this.uniforms.hiresTileMap.value.pos.copy(this.map.hiresTileManager.centerTile); this.camera.layers.set(2); this.renderer.render(this.map.scene, this.camera); this.renderer.clearDepth(); this.camera.layers.set(0); if (this.controlsManager.distance < 2000) this.camera.layers.enable(1); this.renderer.render(this.map.scene, this.camera); this.renderer.render(this.map.markerManager.objectMarkerScene, this.camera); this.css2dRenderer.render(this.map.markerManager.elementMarkerScene, this.camera); } } /** * Changes / Sets the map that will be loaded and displayed * @param map */ ; _proto.setMap = function setMap(map) { var _this3 = this; if (map === void 0) { map = null; } if (this.map && this.map.isMap) this.map.unload(); this.map = map; if (this.map && this.map.isMap) { return map.load(HIRES_VERTEX_SHADER, HIRES_FRAGMENT_SHADER, LOWRES_VERTEX_SHADER, LOWRES_FRAGMENT_SHADER, this.uniforms).then(function () { _this3.skyboxScene.ambientLight = map.ambientLight; _this3.skyboxScene.skyColor = map.skyColor; _this3.uniforms.ambientLight.value = map.ambientLight; _this3.uniforms.hiresTileMap.value.map = map.hiresTileManager.tileMap.texture; _this3.uniforms.hiresTileMap.value.scale.set(map.hires.tileSize.x, map.hires.tileSize.z); _this3.uniforms.hiresTileMap.value.translate.set(map.hires.translate.x, map.hires.translate.z); setTimeout(_this3.updateLoadedMapArea); dispatchEvent(_this3.events, "bluemapMapChanged", { map: map }); }).catch(function (error) { alert(_this3.events, error, "error"); }); } else { return Promise.resolve(); } }; _proto.loadMapArea = function loadMapArea(centerX, centerZ, hiresViewDistance, lowresViewDistance) { if (hiresViewDistance === void 0) { hiresViewDistance = -1; } if (lowresViewDistance === void 0) { lowresViewDistance = -1; } this.loadedCenter.set(centerX, centerZ); if (hiresViewDistance >= 0) this.loadedHiresViewDistance = hiresViewDistance; if (lowresViewDistance >= 0) this.loadedLowresViewDistance = lowresViewDistance; this.updateLoadedMapArea(); }; // -------------------------- /** * Applies a loaded settings-object (settings.json) * @param settings */ _proto.applySettings = function applySettings(settings) { // reset maps this.maps.forEach(function (map) { return map.dispose(); }); this.maps = []; // create maps if (settings.maps !== undefined) { for (var mapId in settings.maps) { if (!settings.maps.hasOwnProperty(mapId)) continue; var mapSettings = settings.maps[mapId]; if (mapSettings.enabled) this.maps.push(new Map(mapId, this.dataUrl + mapId + "/", this.rootElement)); } } // sort maps this.maps.sort(function (map1, map2) { var sort = settings.maps[map1.id].ordinal - settings.maps[map2.id].ordinal; if (isNaN(sort)) return 0; return sort; }); }; _createClass(MapViewer, [{ key: "superSampling", get: function get() { return this.superSamplingValue; }, set: function set(value) { this.superSamplingValue = value; this.handleContainerResize(); } }]); return MapViewer; }(); MapViewer.InteractionType = { LEFTCLICK: 0, RIGHTCLICK: 1 }; /** * Loads and returns a promise with an array of Maps loaded from that root-path.
* DONT FORGET TO dispose() ALL MAPS RETURNED BY THIS METHOD IF YOU DONT NEED THEM ANYMORE! * @param dataUrl * @param events * @returns {Promise} */ var loadMaps = function loadMaps(dataUrl, events) { if (events === void 0) { events = null; } function loadSettings() { return new Promise(function (resolve, reject) { var loader = new three.FileLoader(); loader.setResponseType("json"); loader.load(dataUrl + "settings.json", resolve, function () {}, function () { return reject("Failed to load the settings.json!"); }); }); } return loadSettings().then(function (settings) { var maps = []; // create maps if (settings.maps !== undefined) { for (var mapId in settings.maps) { if (!settings.maps.hasOwnProperty(mapId)) continue; var mapSettings = settings.maps[mapId]; if (mapSettings.enabled) maps.push(new Map(mapId, dataUrl + mapId + "/", events)); } } // sort maps maps.sort(function (map1, map2) { var sort = settings.maps[map1.id].ordinal - settings.maps[map2.id].ordinal; if (isNaN(sort)) return 0; return sort; }); return maps; }); }; exports.MapViewer = MapViewer; exports.alert = alert; exports.animate = animate; exports.dispatchEvent = dispatchEvent; exports.elementOffset = elementOffset; exports.hashTile = hashTile; exports.htmlToElement = htmlToElement; exports.htmlToElements = htmlToElements; exports.loadMaps = loadMaps; exports.pathFromCoords = pathFromCoords; exports.stringToImage = stringToImage; Object.defineProperty(exports, '__esModule', { value: true }); }))); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmx1ZW1hcC5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWwvVXRpbHMuanMiLCIuLi8uLi9zcmMvbWFwL1RpbGUuanMiLCIuLi8uLi9zcmMvbWFwL1RpbGVNYXAuanMiLCIuLi8uLi9zcmMvbWFwL1RpbGVNYW5hZ2VyLmpzIiwiLi4vLi4vc3JjL21hcC9UaWxlTG9hZGVyLmpzIiwiLi4vLi4vc3JjL21hcmtlcnMvTWFya2VyLmpzIiwiLi4vLi4vc3JjL3V0aWwvbGluZXMvTGluZU1hdGVyaWFsLmpzIiwiLi4vLi4vc3JjL3V0aWwvbGluZXMvTGluZVNlZ21lbnRzR2VvbWV0cnkuanMiLCIuLi8uLi9zcmMvdXRpbC9saW5lcy9MaW5lR2VvbWV0cnkuanMiLCIuLi8uLi9zcmMvdXRpbC9saW5lcy9MaW5lU2VnbWVudHMyLmpzIiwiLi4vLi4vc3JjL3V0aWwvbGluZXMvTGluZTIuanMiLCIuLi8uLi9zcmMvbWFya2Vycy9zaGFkZXIvTWFya2VyRmlsbEZyYWdtZW50U2hhZGVyLmpzIiwiLi4vLi4vc3JjL21hcmtlcnMvc2hhZGVyL01hcmtlckZpbGxWZXJ0ZXhTaGFkZXIuanMiLCIuLi8uLi9zcmMvbWFya2Vycy9TaGFwZU1hcmtlci5qcyIsIi4uLy4uL3NyYy9tYXJrZXJzL0xpbmVNYXJrZXIuanMiLCIuLi8uLi9zcmMvbWFya2Vycy9FeHRydWRlTWFya2VyLmpzIiwiLi4vLi4vc3JjL3V0aWwvQ1NTMkRSZW5kZXJlci5qcyIsIi4uLy4uL3NyYy9tYXJrZXJzL0hUTUxNYXJrZXIuanMiLCIuLi8uLi9zcmMvbWFya2Vycy9QT0lNYXJrZXIuanMiLCIuLi8uLi9zcmMvbWFya2Vycy9QbGF5ZXJNYXJrZXIuanMiLCIuLi8uLi9zcmMvbWFya2Vycy9NYXJrZXJTZXQuanMiLCIuLi8uLi9zcmMvbWFya2Vycy9NYXJrZXJNYW5hZ2VyLmpzIiwiLi4vLi4vc3JjL21hcC9NYXAuanMiLCIuLi8uLi9zcmMvc2t5Ym94L1NreUZyYWdtZW50U2hhZGVyLmpzIiwiLi4vLi4vc3JjL3NreWJveC9Ta3lWZXJ0ZXhTaGFkZXIuanMiLCIuLi8uLi9zcmMvc2t5Ym94L1NreWJveFNjZW5lLmpzIiwiLi4vLi4vc3JjL2NvbnRyb2xzL0NvbnRyb2xzTWFuYWdlci5qcyIsIi4uLy4uL3NyYy9jb250cm9scy9NYXBDb250cm9scy5qcyIsIi4uLy4uL3NyYy91dGlsL1N0YXRzLmpzIiwiLi4vLi4vc3JjL21hcC9oaXJlcy9IaXJlc1ZlcnRleFNoYWRlci5qcyIsIi4uLy4uL3NyYy9tYXAvaGlyZXMvSGlyZXNGcmFnbWVudFNoYWRlci5qcyIsIi4uLy4uL3NyYy9tYXAvbG93cmVzL0xvd3Jlc1ZlcnRleFNoYWRlci5qcyIsIi4uLy4uL3NyYy9tYXAvbG93cmVzL0xvd3Jlc0ZyYWdtZW50U2hhZGVyLmpzIiwiLi4vLi4vc3JjL3V0aWwvQ29tYmluZWRDYW1lcmEuanMiLCIuLi8uLi9zcmMvTWFwVmlld2VyLmpzIiwiLi4vLi4vc3JjL0JsdWVNYXAuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIFRha2VzIGEgYmFzZTQ2IHN0cmluZyBhbmQgY29udmVydHMgaXQgaW50byBhbiBpbWFnZSBlbGVtZW50XHJcbiAqIEBwYXJhbSBzdHJpbmdcclxuICogQHJldHVybnMge0hUTUxFbGVtZW50fVxyXG4gKi9cclxuaW1wb3J0IHtNYXRoVXRpbHN9IGZyb20gXCJ0aHJlZVwiO1xyXG5cclxuZXhwb3J0IGNvbnN0IHN0cmluZ1RvSW1hZ2UgPSBzdHJpbmcgPT4ge1xyXG4gICAgbGV0IGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJywgJ2ltZycpO1xyXG4gICAgaW1hZ2Uuc3JjID0gc3RyaW5nO1xyXG4gICAgcmV0dXJuIGltYWdlO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYW4gb3B0aW1pemVkIHBhdGggZnJvbSB4LHogY29vcmRpbmF0ZXMgdXNlZCBieSBibHVlbWFwIHRvIHNhdmUgdGlsZXNcclxuICogQHBhcmFtIHhcclxuICogQHBhcmFtIHpcclxuICogQHJldHVybnMge3N0cmluZ31cclxuICovXHJcbmV4cG9ydCBjb25zdCBwYXRoRnJvbUNvb3JkcyA9ICh4LCB6KSA9PiB7XHJcbiAgICBsZXQgcGF0aCA9ICd4JztcclxuICAgIHBhdGggKz0gc3BsaXROdW1iZXJUb1BhdGgoeCk7XHJcblxyXG4gICAgcGF0aCArPSAneic7XHJcbiAgICBwYXRoICs9IHNwbGl0TnVtYmVyVG9QYXRoKHopO1xyXG5cclxuICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxlbmd0aCAtIDEpO1xyXG5cclxuICAgIHJldHVybiBwYXRoO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFNwbGl0cyBhIG51bWJlciBpbnRvIGFuIG9wdGltaXplZCBmb2xkZXItcGF0aCB1c2VkIHRvIHNhdmUgYmx1ZW1hcC10aWxlc1xyXG4gKiBAcGFyYW0gbnVtXHJcbiAqIEByZXR1cm5zIHtzdHJpbmd9XHJcbiAqL1xyXG5jb25zdCBzcGxpdE51bWJlclRvUGF0aCA9IG51bSA9PiB7XHJcbiAgICBsZXQgcGF0aCA9ICcnO1xyXG5cclxuICAgIGlmIChudW0gPCAwKSB7XHJcbiAgICAgICAgbnVtID0gLW51bTtcclxuICAgICAgICBwYXRoICs9ICctJztcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcyA9IHBhcnNlSW50KG51bSkudG9TdHJpbmcoKTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBwYXRoICs9IHMuY2hhckF0KGkpICsgJy8nO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBwYXRoO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEhhc2hlcyB0aWxlLWNvb3JkaW5hdGVzIHRvIGJlIHNhdmVkIGluIGEgbWFwXHJcbiAqIEBwYXJhbSB4XHJcbiAqIEBwYXJhbSB6XHJcbiAqIEByZXR1cm5zIHtzdHJpbmd9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgaGFzaFRpbGUgPSAoeCwgeikgPT4gYHgke3h9eiR7en1gO1xyXG5cclxuXHJcbi8qKlxyXG4gKiBEaXNwYXRjaGVzIGFuIGV2ZW50IHRvIHRoZSBlbGVtZW50IG9mIHRoaXMgbWFwLXZpZXdlclxyXG4gKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCBvbiB0aGF0IHRoZSBldmVudCBpcyBkaXNwYXRjaGVkXHJcbiAqIEBwYXJhbSBldmVudFxyXG4gKiBAcGFyYW0gZGV0YWlsXHJcbiAqIEByZXR1cm5zIHt1bmRlZmluZWR8dm9pZHxib29sZWFufVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGRpc3BhdGNoRXZlbnQgPSAoZWxlbWVudCwgZXZlbnQsIGRldGFpbCA9IHt9KSA9PiB7XHJcbiAgICBpZiAoIWVsZW1lbnQgfHwgIWVsZW1lbnQuZGlzcGF0Y2hFdmVudCkgcmV0dXJuO1xyXG5cclxuICAgIHJldHVybiBlbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KGV2ZW50LCB7XHJcbiAgICAgICAgZGV0YWlsOiBkZXRhaWxcclxuICAgIH0pKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFNlbmRzIGEgXCJibHVlbWFwQWxlcnRcIiBldmVudCB3aXRoIGEgbWVzc2FnZSBhbmQgYSBsZXZlbC5cclxuICogVGhlIGxldmVsIGNhbiBiZSBhbnl0aGluZywgYnV0IHRoZSBhcHAgdXNlcyB0aGUgbGV2ZWxzXHJcbiAqIC0gZGVidWdcclxuICogLSBmaW5lXHJcbiAqIC0gaW5mb1xyXG4gKiAtIHdhcm5pbmdcclxuICogLSBlcnJvclxyXG4gKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCBvbiB0aGF0IHRoZSBldmVudCBpcyBkaXNwYXRjaGVkXHJcbiAqIEBwYXJhbSBtZXNzYWdlXHJcbiAqIEBwYXJhbSBsZXZlbFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGFsZXJ0ID0gKGVsZW1lbnQsIG1lc3NhZ2UsIGxldmVsID0gXCJpbmZvXCIpID0+IHtcclxuXHJcbiAgICAvLyBhbGVydCBldmVudFxyXG4gICAgbGV0IHByaW50VG9Db25zb2xlID0gZGlzcGF0Y2hFdmVudChlbGVtZW50LCBcImJsdWVtYXBBbGVydFwiLCB7XHJcbiAgICAgICAgbWVzc2FnZTogbWVzc2FnZSxcclxuICAgICAgICBsZXZlbDogbGV2ZWxcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIGxvZyBhbGVydCB0byBjb25zb2xlXHJcbiAgICBpZiAocHJpbnRUb0NvbnNvbGUpIHtcclxuICAgICAgICBpZiAobGV2ZWwgPT09IFwiaW5mb1wiKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBbQmx1ZU1hcC8ke2xldmVsfV1gLCBtZXNzYWdlKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGxldmVsID09PSBcIndhcm5pbmdcIikge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFtCbHVlTWFwLyR7bGV2ZWx9XWAsIG1lc3NhZ2UpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobGV2ZWwgPT09IFwiZXJyb3JcIikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBbQmx1ZU1hcC8ke2xldmVsfV1gLCBtZXNzYWdlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKGBbQmx1ZU1hcC8ke2xldmVsfV1gLCBtZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTb3VyY2U6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQ5NDE0My9jcmVhdGluZy1hLW5ldy1kb20tZWxlbWVudC1mcm9tLWFuLWh0bWwtc3RyaW5nLXVzaW5nLWJ1aWx0LWluLWRvbS1tZXRob2RzLW9yLXByby8zNTM4NTUxOCMzNTM4NTUxOFxyXG4gKlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gaHRtbCByZXByZXNlbnRpbmcgYSBzaW5nbGUgZWxlbWVudFxyXG4gKiBAcmV0dXJuIHtFbGVtZW50fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGh0bWxUb0VsZW1lbnQgPSBodG1sID0+IHtcclxuICAgIGxldCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7XHJcbiAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBodG1sLnRyaW0oKTtcclxuICAgIHJldHVybiB0ZW1wbGF0ZS5jb250ZW50LmZpcnN0Q2hpbGQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTb3VyY2U6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQ5NDE0My9jcmVhdGluZy1hLW5ldy1kb20tZWxlbWVudC1mcm9tLWFuLWh0bWwtc3RyaW5nLXVzaW5nLWJ1aWx0LWluLWRvbS1tZXRob2RzLW9yLXByby8zNTM4NTUxOCMzNTM4NTUxOFxyXG4gKlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gaHRtbCByZXByZXNlbnRpbmcgYW55IG51bWJlciBvZiBzaWJsaW5nIGVsZW1lbnRzXHJcbiAqIEByZXR1cm4ge05vZGVMaXN0fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGh0bWxUb0VsZW1lbnRzID0gaHRtbCA9PiB7XHJcbiAgICBsZXQgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO1xyXG4gICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gaHRtbDtcclxuICAgIHJldHVybiB0ZW1wbGF0ZS5jb250ZW50LmNoaWxkTm9kZXM7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTY2hlZHVsZXMgYW4gYW5pbWF0aW9uXHJcbiAqIEBwYXJhbSBkdXJhdGlvbk1zIHRoZSBkdXJhdGlvbiBvZiB0aGUgYW5pbWF0aW9uIGluIG1zXHJcbiAqIEBwYXJhbSBhbmltYXRpb25GcmFtZSBhIGZ1bmN0aW9uIHRoYXQgaXMgZ2V0dGluZyBjYWxsZWQgZWFjaCBmcmFtZSB3aXRoIHRoZSBwYXJhbWV0ZXJzIChwcm9ncmVzcyAoMC0xKSwgZGVsdGFUaW1lKVxyXG4gKiBAcGFyYW0gcG9zdEFuaW1hdGlvbiBhIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgb25jZSBhZnRlciB0aGUgYW5pbWF0aW9uIGlzIGZpbmlzaGVkIG9yIGNhbmNlbGxlZC4gVGhlIGZ1bmN0aW9uIGFjY2VwdHMgb25lIGJvb2wtcGFyYW1ldGVyIHdoZXRoZXIgdGhlIGFuaW1hdGlvbiB3YXMgZmluaXNoZWQgKHRydWUpIG9yIGNhbmNlbGVkIChmYWxzZSlcclxuICogQHJldHVybnMgdGhlIGFuaW1hdGlvbiBvYmplY3RcclxuICovXHJcbmV4cG9ydCBjb25zdCBhbmltYXRlID0gZnVuY3Rpb24gKGFuaW1hdGlvbkZyYW1lLCBkdXJhdGlvbk1zID0gMTAwMCwgcG9zdEFuaW1hdGlvbiA9IG51bGwpIHtcclxuICAgIGxldCBhbmltYXRpb24gPSB7XHJcbiAgICAgICAgYW5pbWF0aW9uU3RhcnQ6IC0xLFxyXG4gICAgICAgIGxhc3RGcmFtZTogLTEsXHJcbiAgICAgICAgY2FuY2VsbGVkOiBmYWxzZSxcclxuXHJcbiAgICAgICAgZnJhbWU6IGZ1bmN0aW9uICh0aW1lKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNhbmNlbGxlZCkgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuYW5pbWF0aW9uU3RhcnQgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFuaW1hdGlvblN0YXJ0ID0gdGltZTtcclxuICAgICAgICAgICAgICAgIHRoaXMubGFzdEZyYW1lID0gdGltZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IHByb2dyZXNzID0gTWF0aFV0aWxzLmNsYW1wKCh0aW1lIC0gdGhpcy5hbmltYXRpb25TdGFydCkgLyBkdXJhdGlvbk1zLCAwLCAxKTtcclxuICAgICAgICAgICAgbGV0IGRlbHRhVGltZSA9IHRpbWUgLSB0aGlzLmxhc3RGcmFtZTtcclxuXHJcbiAgICAgICAgICAgIGFuaW1hdGlvbkZyYW1lKHByb2dyZXNzLCBkZWx0YVRpbWUpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHByb2dyZXNzIDwgMSkgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSh0aW1lID0+IHRoaXMuZnJhbWUodGltZSkpO1xyXG4gICAgICAgICAgICBlbHNlIGlmIChwb3N0QW5pbWF0aW9uKSBwb3N0QW5pbWF0aW9uKHRydWUpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5sYXN0RnJhbWUgPSB0aW1lO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGNhbmNlbDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLmNhbmNlbGxlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmIChwb3N0QW5pbWF0aW9uKSBwb3N0QW5pbWF0aW9uKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGltZSA9PiBhbmltYXRpb24uZnJhbWUodGltZSkpO1xyXG5cclxuICAgIHJldHVybiBhbmltYXRpb247XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBvZmZzZXQgcG9zaXRpb24gb2YgYW4gZWxlbWVudFxyXG4gKlxyXG4gKiBTb3VyY2U6IGh0dHBzOi8vcGxhaW5qcy5jb20vamF2YXNjcmlwdC9zdHlsZXMvZ2V0LXRoZS1wb3NpdGlvbi1vZi1hbi1lbGVtZW50LXJlbGF0aXZlLXRvLXRoZS1kb2N1bWVudC0yNC9cclxuICpcclxuICogQHBhcmFtIGVsZW1lbnRcclxuICogQHJldHVybnMge3t0b3A6IG51bWJlciwgbGVmdDogbnVtYmVyfX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBlbGVtZW50T2Zmc2V0ID0gKGVsZW1lbnQpID0+IHtcclxuICAgIGxldCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcclxuICAgICAgICBzY3JvbGxMZWZ0ID0gd2luZG93LnBhZ2VYT2Zmc2V0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0LFxyXG4gICAgICAgIHNjcm9sbFRvcCA9IHdpbmRvdy5wYWdlWU9mZnNldCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wO1xyXG4gICAgcmV0dXJuIHsgdG9wOiByZWN0LnRvcCArIHNjcm9sbFRvcCwgbGVmdDogcmVjdC5sZWZ0ICsgc2Nyb2xsTGVmdCB9XHJcbn1cclxuXHJcbiIsIi8qXHJcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJsdWVNYXAsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSAoTUlUKS5cclxuICpcclxuICogQ29weXJpZ2h0IChjKSBCbHVlIChMdWthcyBSaWVnZXIpIDxodHRwczovL2JsdWVjb2xvcmVkLmRlPlxyXG4gKiBDb3B5cmlnaHQgKGMpIGNvbnRyaWJ1dG9yc1xyXG4gKlxyXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XHJcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcclxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xyXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXHJcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xyXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxyXG4gKlxyXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxyXG4gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cclxuICpcclxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxyXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcclxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXHJcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcclxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcclxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxyXG4gKiBUSEUgU09GVFdBUkUuXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIFRpbGUge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHgsIHosIG9uTG9hZCwgb25VbmxvYWQpIHtcclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdpc1RpbGUnLCB7IHZhbHVlOiB0cnVlIH0gKTtcclxuXHJcbiAgICAgICAgdGhpcy5tb2RlbCA9IG51bGw7XHJcblxyXG4gICAgICAgIHRoaXMub25Mb2FkID0gb25Mb2FkO1xyXG4gICAgICAgIHRoaXMub25VbmxvYWQgPSBvblVubG9hZDtcclxuXHJcbiAgICAgICAgdGhpcy54ID0geDtcclxuICAgICAgICB0aGlzLnogPSB6O1xyXG5cclxuICAgICAgICB0aGlzLnVubG9hZGVkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBsb2FkKHRpbGVMb2FkZXIpIHtcclxuICAgICAgICBpZiAodGhpcy5sb2FkaW5nKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgdGhpcy51bmxvYWQoKTtcclxuXHJcbiAgICAgICAgdGhpcy51bmxvYWRlZCA9IGZhbHNlO1xyXG4gICAgICAgIHJldHVybiB0aWxlTG9hZGVyLmxvYWQodGhpcy54LCB0aGlzLnopXHJcbiAgICAgICAgICAgIC50aGVuKG1vZGVsID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnVubG9hZGVkKXtcclxuICAgICAgICAgICAgICAgICAgICBtb2RlbC5nZW9tZXRyeS5kaXNwb3NlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDtcclxuICAgICAgICAgICAgICAgIHRoaXMub25Mb2FkKHRoaXMpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAuZmluYWxseSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdW5sb2FkKCkge1xyXG4gICAgICAgIHRoaXMudW5sb2FkZWQgPSB0cnVlO1xyXG4gICAgICAgIGlmICh0aGlzLm1vZGVsKSB7XHJcbiAgICAgICAgICAgIHRoaXMub25VbmxvYWQodGhpcyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLm1vZGVsLmdlb21ldHJ5LmRpc3Bvc2UoKTtcclxuICAgICAgICAgICAgdGhpcy5tb2RlbCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBsb2FkZWQoKSB7XHJcbiAgICAgICAgcmV0dXJuICEhdGhpcy5tb2RlbDtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQge0NsYW1wVG9FZGdlV3JhcHBpbmcsIExpbmVhckZpbHRlciwgVGV4dHVyZX0gZnJvbSBcInRocmVlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgVGlsZU1hcCB7XHJcblxyXG4gICAgc3RhdGljIEVNUFRZID0gXCIjMDAwXCI7XHJcbiAgICBzdGF0aWMgTE9BREVEID0gXCIjZmZmXCI7XHJcblxyXG4gICAgY29uc3RydWN0b3Iod2lkdGgsIGhlaWdodCkge1xyXG4gICAgICAgIHRoaXMuY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJywgJ2NhbnZhcycpO1xyXG4gICAgICAgIHRoaXMuY2FudmFzLndpZHRoID0gd2lkdGg7XHJcbiAgICAgICAgdGhpcy5jYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xyXG5cclxuICAgICAgICB0aGlzLnRpbGVNYXBDb250ZXh0ID0gdGhpcy5jYW52YXMuZ2V0Q29udGV4dCgnMmQnLCB7XHJcbiAgICAgICAgICAgIGFscGhhOiBmYWxzZSxcclxuICAgICAgICAgICAgd2lsbFJlYWRGcmVxdWVudGx5OiB0cnVlLFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnRleHR1cmUgPSBuZXcgVGV4dHVyZSh0aGlzLmNhbnZhcyk7XHJcbiAgICAgICAgdGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMudGV4dHVyZS5tYWdGaWx0ZXIgPSBMaW5lYXJGaWx0ZXI7XHJcbiAgICAgICAgdGhpcy50ZXh0dXJlLm1pbkZpbHRlciA9IExpbmVhckZpbHRlcjtcclxuICAgICAgICB0aGlzLnRleHR1cmUud3JhcFMgPSBDbGFtcFRvRWRnZVdyYXBwaW5nO1xyXG4gICAgICAgIHRoaXMudGV4dHVyZS53cmFwVCA9IENsYW1wVG9FZGdlV3JhcHBpbmc7XHJcbiAgICAgICAgdGhpcy50ZXh0dXJlLmZsaXBZID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy50ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRBbGwoc3RhdGUpIHtcclxuICAgICAgICB0aGlzLnRpbGVNYXBDb250ZXh0LmZpbGxTdHlsZSA9IHN0YXRlO1xyXG4gICAgICAgIHRoaXMudGlsZU1hcENvbnRleHQuZmlsbFJlY3QoMCwgMCwgdGhpcy5jYW52YXMud2lkdGgsIHRoaXMuY2FudmFzLmhlaWdodCk7XHJcblxyXG4gICAgICAgIHRoaXMudGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0VGlsZSh4LCB6LCBzdGF0ZSkge1xyXG4gICAgICAgIHRoaXMudGlsZU1hcENvbnRleHQuZmlsbFN0eWxlID0gc3RhdGU7XHJcbiAgICAgICAgdGhpcy50aWxlTWFwQ29udGV4dC5maWxsUmVjdCh4LCB6LCAxLCAxKTtcclxuXHJcbiAgICAgICAgdGhpcy50ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbn0iLCIvKlxyXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBCbHVlTWFwLCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgKE1JVCkuXHJcbiAqXHJcbiAqIENvcHlyaWdodCAoYykgQmx1ZSAoTHVrYXMgUmllZ2VyKSA8aHR0cHM6Ly9ibHVlY29sb3JlZC5kZT5cclxuICogQ29weXJpZ2h0IChjKSBjb250cmlidXRvcnNcclxuICpcclxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxyXG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXHJcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcclxuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxyXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcclxuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcclxuICpcclxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cclxuICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXHJcbiAqXHJcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcclxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXHJcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxyXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXHJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXHJcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cclxuICogVEhFIFNPRlRXQVJFLlxyXG4gKi9cclxuXHJcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICd0aHJlZSc7XHJcbmltcG9ydCAgeyBUaWxlIH0gZnJvbSAnLi9UaWxlLmpzJztcclxuaW1wb3J0IHthbGVydCwgaGFzaFRpbGV9IGZyb20gJy4uL3V0aWwvVXRpbHMuanMnO1xyXG5pbXBvcnQge1RpbGVNYXB9IGZyb20gXCIuL1RpbGVNYXBcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBUaWxlTWFuYWdlciB7XHJcblxyXG4gICAgc3RhdGljIHRpbGVNYXBTaXplID0gMTAwO1xyXG4gICAgc3RhdGljIHRpbGVNYXBIYWxmU2l6ZSA9IFRpbGVNYW5hZ2VyLnRpbGVNYXBTaXplIC8gMjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihzY2VuZSwgdGlsZUxvYWRlciwgb25UaWxlTG9hZCA9IG51bGwsIG9uVGlsZVVubG9hZCA9IG51bGwsIGV2ZW50cyA9IG51bGwpIHtcclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdpc1RpbGVNYW5hZ2VyJywgeyB2YWx1ZTogdHJ1ZSB9ICk7XHJcblxyXG4gICAgICAgIHRoaXMuZXZlbnRzID0gZXZlbnRzO1xyXG4gICAgICAgIHRoaXMuc2NlbmUgPSBzY2VuZTtcclxuICAgICAgICB0aGlzLnRpbGVMb2FkZXIgPSB0aWxlTG9hZGVyO1xyXG5cclxuICAgICAgICB0aGlzLm9uVGlsZUxvYWQgPSBvblRpbGVMb2FkIHx8IGZ1bmN0aW9uKCl7fTtcclxuICAgICAgICB0aGlzLm9uVGlsZVVubG9hZCA9IG9uVGlsZVVubG9hZCB8fCBmdW5jdGlvbigpe307XHJcblxyXG4gICAgICAgIHRoaXMudmlld0Rpc3RhbmNlWCA9IDE7XHJcbiAgICAgICAgdGhpcy52aWV3RGlzdGFuY2VaID0gMTtcclxuICAgICAgICB0aGlzLmNlbnRlclRpbGUgPSBuZXcgVmVjdG9yMigwLCAwKTtcclxuXHJcbiAgICAgICAgdGhpcy5jdXJyZW50bHlMb2FkaW5nID0gMDtcclxuICAgICAgICB0aGlzLmxvYWRUaW1lb3V0ID0gbnVsbDtcclxuXHJcbiAgICAgICAgLy9tYXAgb2YgbG9hZGVkIHRpbGVzXHJcbiAgICAgICAgdGhpcy50aWxlcyA9IHt9O1xyXG5cclxuICAgICAgICAvLyBhIGNhbnZhcyB0aGF0IGtlZXBzIHRyYWNrIG9mIHRoZSBsb2FkZWQgdGlsZXMsIHVzZWQgZm9yIHNoYWRlcnNcclxuICAgICAgICB0aGlzLnRpbGVNYXAgPSBuZXcgVGlsZU1hcChUaWxlTWFuYWdlci50aWxlTWFwU2l6ZSwgVGlsZU1hbmFnZXIudGlsZU1hcFNpemUpO1xyXG5cclxuICAgICAgICB0aGlzLnVubG9hZGVkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBsb2FkQXJvdW5kVGlsZSh4LCB6LCB2aWV3RGlzdGFuY2VYLCB2aWV3RGlzdGFuY2VaKSB7XHJcbiAgICAgICAgdGhpcy51bmxvYWRlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICB0aGlzLnZpZXdEaXN0YW5jZVggPSB2aWV3RGlzdGFuY2VYO1xyXG4gICAgICAgIHRoaXMudmlld0Rpc3RhbmNlWiA9IHZpZXdEaXN0YW5jZVo7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNlbnRlclRpbGUueCAhPT0geCB8fCB0aGlzLmNlbnRlclRpbGUueSAhPT0geikge1xyXG4gICAgICAgICAgICB0aGlzLmNlbnRlclRpbGUuc2V0KHgsIHopO1xyXG4gICAgICAgICAgICB0aGlzLnJlbW92ZUZhclRpbGVzKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnRpbGVNYXAuc2V0QWxsKFRpbGVNYXAuRU1QVFkpO1xyXG4gICAgICAgICAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMudGlsZXMpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy50aWxlcy5oYXNPd25Qcm9wZXJ0eShrZXlzW2ldKSkgY29udGludWU7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IHRpbGUgPSB0aGlzLnRpbGVzW2tleXNbaV1dO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aWxlLmxvYWRpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbGVNYXAuc2V0VGlsZSh0aWxlLnggLSB0aGlzLmNlbnRlclRpbGUueCArIFRpbGVNYW5hZ2VyLnRpbGVNYXBIYWxmU2l6ZSwgdGlsZS56IC0gdGhpcy5jZW50ZXJUaWxlLnkgKyBUaWxlTWFuYWdlci50aWxlTWFwSGFsZlNpemUsIFRpbGVNYXAuTE9BREVEKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5sb2FkQ2xvc2VUaWxlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHVubG9hZCgpIHtcclxuICAgICAgICB0aGlzLnVubG9hZGVkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnJlbW92ZUFsbFRpbGVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlRmFyVGlsZXMoKSB7XHJcbiAgICAgICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLnRpbGVzKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLnRpbGVzLmhhc093blByb3BlcnR5KGtleXNbaV0pKSBjb250aW51ZTtcclxuXHJcbiAgICAgICAgICAgIGxldCB0aWxlID0gdGhpcy50aWxlc1trZXlzW2ldXTtcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgdGlsZS54ICsgdGhpcy52aWV3RGlzdGFuY2VYIDwgdGhpcy5jZW50ZXJUaWxlLnggfHxcclxuICAgICAgICAgICAgICAgIHRpbGUueCAtIHRoaXMudmlld0Rpc3RhbmNlWCA+IHRoaXMuY2VudGVyVGlsZS54IHx8XHJcbiAgICAgICAgICAgICAgICB0aWxlLnogKyB0aGlzLnZpZXdEaXN0YW5jZVogPCB0aGlzLmNlbnRlclRpbGUueSB8fFxyXG4gICAgICAgICAgICAgICAgdGlsZS56IC0gdGhpcy52aWV3RGlzdGFuY2VaID4gdGhpcy5jZW50ZXJUaWxlLnlcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICB0aWxlLnVubG9hZCgpO1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMudGlsZXNba2V5c1tpXV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlQWxsVGlsZXMoKSB7XHJcbiAgICAgICAgdGhpcy50aWxlTWFwLnNldEFsbChUaWxlTWFwLkVNUFRZKTtcclxuXHJcbiAgICAgICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLnRpbGVzKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLnRpbGVzLmhhc093blByb3BlcnR5KGtleXNbaV0pKSBjb250aW51ZTtcclxuXHJcbiAgICAgICAgICAgIGxldCB0aWxlID0gdGhpcy50aWxlc1trZXlzW2ldXTtcclxuICAgICAgICAgICAgdGlsZS51bmxvYWQoKTtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMudGlsZXNba2V5c1tpXV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxvYWRDbG9zZVRpbGVzID0gKCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLnVubG9hZGVkKSByZXR1cm47XHJcbiAgICAgICAgaWYgKCF0aGlzLmxvYWROZXh0VGlsZSgpKSByZXR1cm47XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmxvYWRUaW1lb3V0KSBjbGVhclRpbWVvdXQodGhpcy5sb2FkVGltZW91dCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRseUxvYWRpbmcgPCA0KSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZFRpbWVvdXQgPSBzZXRUaW1lb3V0KHRoaXMubG9hZENsb3NlVGlsZXMsIDApO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZFRpbWVvdXQgPSBzZXRUaW1lb3V0KHRoaXMubG9hZENsb3NlVGlsZXMsIDEwMDApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgbG9hZE5leHRUaWxlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnVubG9hZGVkKSByZXR1cm47XHJcblxyXG4gICAgICAgIGxldCB4ID0gMDtcclxuICAgICAgICBsZXQgeiA9IDA7XHJcbiAgICAgICAgbGV0IGQgPSAxO1xyXG4gICAgICAgIGxldCBtID0gMTtcclxuXHJcbiAgICAgICAgd2hpbGUgKG0gPCBNYXRoLm1heCh0aGlzLnZpZXdEaXN0YW5jZVgsIHRoaXMudmlld0Rpc3RhbmNlWikgKiAyICsgMSkge1xyXG4gICAgICAgICAgICB3aGlsZSAoMiAqIHggKiBkIDwgbSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudHJ5TG9hZFRpbGUodGhpcy5jZW50ZXJUaWxlLnggKyB4LCB0aGlzLmNlbnRlclRpbGUueSArIHopKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHggPSB4ICsgZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB3aGlsZSAoMiAqIHogKiBkIDwgbSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudHJ5TG9hZFRpbGUodGhpcy5jZW50ZXJUaWxlLnggKyB4LCB0aGlzLmNlbnRlclRpbGUueSArIHopKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHogPSB6ICsgZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBkID0gLTEgKiBkO1xyXG4gICAgICAgICAgICBtID0gbSArIDE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5TG9hZFRpbGUoeCwgeikge1xyXG4gICAgICAgIGlmICh0aGlzLnVubG9hZGVkKSByZXR1cm47XHJcblxyXG4gICAgICAgIGlmIChNYXRoLmFicyh4IC0gdGhpcy5jZW50ZXJUaWxlLngpID4gdGhpcy52aWV3RGlzdGFuY2VYKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgaWYgKE1hdGguYWJzKHogLSB0aGlzLmNlbnRlclRpbGUueSkgPiB0aGlzLnZpZXdEaXN0YW5jZVopIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgbGV0IHRpbGVIYXNoID0gaGFzaFRpbGUoeCwgeik7XHJcblxyXG4gICAgICAgIGxldCB0aWxlID0gdGhpcy50aWxlc1t0aWxlSGFzaF07XHJcbiAgICAgICAgaWYgKHRpbGUgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICB0aGlzLmN1cnJlbnRseUxvYWRpbmcrKztcclxuXHJcbiAgICAgICAgdGlsZSA9IG5ldyBUaWxlKHgsIHosIHRoaXMuaGFuZGxlTG9hZGVkVGlsZSwgdGhpcy5oYW5kbGVVbmxvYWRlZFRpbGUpO1xyXG4gICAgICAgIHRoaXMudGlsZXNbdGlsZUhhc2hdID0gdGlsZTtcclxuICAgICAgICB0aWxlLmxvYWQodGhpcy50aWxlTG9hZGVyKVxyXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRpbGVNYXAuc2V0VGlsZSh0aWxlLnggLSB0aGlzLmNlbnRlclRpbGUueCArIFRpbGVNYW5hZ2VyLnRpbGVNYXBIYWxmU2l6ZSwgdGlsZS56IC0gdGhpcy5jZW50ZXJUaWxlLnkgKyBUaWxlTWFuYWdlci50aWxlTWFwSGFsZlNpemUsIFRpbGVNYXAuTE9BREVEKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5sb2FkVGltZW91dCkgY2xlYXJUaW1lb3V0KHRoaXMubG9hZFRpbWVvdXQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkVGltZW91dCA9IHNldFRpbWVvdXQodGhpcy5sb2FkQ2xvc2VUaWxlcywgMCk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5jYXRjaChlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzICYmIGVycm9yLnN0YXR1cyA9PT0gXCJlbXB0eVwiKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IudGFyZ2V0ICYmIGVycm9yLnRhcmdldC5zdGF0dXMgPT09IDQwNCkgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgICAgIGFsZXJ0KHRoaXMuZXZlbnRzLCBcIkZhaWxlZCB0byBsb2FkIHRpbGU6IFwiICsgZXJyb3IsIFwid2FybmluZ1wiKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLmZpbmFsbHkoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50aWxlTWFwLnNldFRpbGUodGlsZS54IC0gdGhpcy5jZW50ZXJUaWxlLnggKyBUaWxlTWFuYWdlci50aWxlTWFwSGFsZlNpemUsIHRpbGUueiAtIHRoaXMuY2VudGVyVGlsZS55ICsgVGlsZU1hbmFnZXIudGlsZU1hcEhhbGZTaXplLCBUaWxlTWFwLkxPQURFRCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRseUxvYWRpbmctLTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZUxvYWRlZFRpbGUgPSB0aWxlID0+IHtcclxuICAgICAgICAvL3RoaXMudGlsZU1hcC5zZXRUaWxlKHRpbGUueCAtIHRoaXMuY2VudGVyVGlsZS54ICsgVGlsZU1hbmFnZXIudGlsZU1hcEhhbGZTaXplLCB0aWxlLnogLSB0aGlzLmNlbnRlclRpbGUueSArIFRpbGVNYW5hZ2VyLnRpbGVNYXBIYWxmU2l6ZSwgVGlsZU1hcC5MT0FERUQpO1xyXG5cclxuICAgICAgICB0aGlzLnNjZW5lLmFkZCh0aWxlLm1vZGVsKTtcclxuICAgICAgICB0aGlzLm9uVGlsZUxvYWQodGlsZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlVW5sb2FkZWRUaWxlID0gdGlsZSA9PiB7XHJcbiAgICAgICAgdGhpcy50aWxlTWFwLnNldFRpbGUodGlsZS54IC0gdGhpcy5jZW50ZXJUaWxlLnggKyBUaWxlTWFuYWdlci50aWxlTWFwSGFsZlNpemUsIHRpbGUueiAtIHRoaXMuY2VudGVyVGlsZS55ICsgVGlsZU1hbmFnZXIudGlsZU1hcEhhbGZTaXplLCBUaWxlTWFwLkVNUFRZKTtcclxuXHJcbiAgICAgICAgdGhpcy5zY2VuZS5yZW1vdmUodGlsZS5tb2RlbCk7XHJcbiAgICAgICAgdGhpcy5vblRpbGVVbmxvYWQodGlsZSk7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHtwYXRoRnJvbUNvb3Jkc30gZnJvbSBcIi4uL3V0aWwvVXRpbHNcIjtcclxuaW1wb3J0IHtCdWZmZXJHZW9tZXRyeUxvYWRlciwgRmlsZUxvYWRlciwgTWVzaH0gZnJvbSBcInRocmVlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgVGlsZUxvYWRlciB7XHJcblxyXG4gICAgY29uc3RydWN0b3IodGlsZVBhdGgsIG1hdGVyaWFsLCB0aWxlU2V0dGluZ3MsIGxheWVyID0gMCkge1xyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ2lzVGlsZUxvYWRlcicsIHsgdmFsdWU6IHRydWUgfSApO1xyXG5cclxuICAgICAgICB0aGlzLnRpbGVQYXRoID0gdGlsZVBhdGg7XHJcbiAgICAgICAgdGhpcy5tYXRlcmlhbCA9IG1hdGVyaWFsO1xyXG4gICAgICAgIHRoaXMudGlsZVNldHRpbmdzID0gdGlsZVNldHRpbmdzO1xyXG5cclxuICAgICAgICB0aGlzLmxheWVyID0gbGF5ZXI7XHJcblxyXG4gICAgICAgIHRoaXMuZmlsZUxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCk7XHJcbiAgICAgICAgdGhpcy5maWxlTG9hZGVyLnNldFJlc3BvbnNlVHlwZSgnanNvbicpO1xyXG5cclxuICAgICAgICB0aGlzLmJ1ZmZlckdlb21ldHJ5TG9hZGVyID0gbmV3IEJ1ZmZlckdlb21ldHJ5TG9hZGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgbG9hZCA9ICh0aWxlWCwgdGlsZVopID0+IHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmZpbGVMb2FkZXIubG9hZCh0aGlzLnRpbGVQYXRoICsgcGF0aEZyb21Db29yZHModGlsZVgsIHRpbGVaKSArICcuanNvbicsXHJcbiAgICAgICAgICAgICAgICBnZW9tZXRyeUpzb24gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghZ2VvbWV0cnlKc29uLnR5cGUgfHwgZ2VvbWV0cnlKc29uLnR5cGUgIT09ICdCdWZmZXJHZW9tZXRyeScpIHJlamVjdCh7c3RhdHVzOiBcImVtcHR5XCJ9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGdlb21ldHJ5ID0gdGhpcy5idWZmZXJHZW9tZXRyeUxvYWRlci5wYXJzZShnZW9tZXRyeUpzb24pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgb2JqZWN0ID0gbmV3IE1lc2goZ2VvbWV0cnksIHRoaXMubWF0ZXJpYWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmxheWVyKSBvYmplY3QubGF5ZXJzLnNldCh0aGlzLmxheWVyKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRpbGVTaXplID0gdGhpcy50aWxlU2V0dGluZ3MudGlsZVNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRyYW5zbGF0ZSA9IHRoaXMudGlsZVNldHRpbmdzLnRyYW5zbGF0ZTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgc2NhbGUgPSB0aGlzLnRpbGVTZXR0aW5ncy5zY2FsZTtcclxuICAgICAgICAgICAgICAgICAgICBvYmplY3QucG9zaXRpb24uc2V0KHRpbGVYICogdGlsZVNpemUueCArIHRyYW5zbGF0ZS54LCAwLCB0aWxlWiAqIHRpbGVTaXplLnogKyB0cmFuc2xhdGUueik7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNjYWxlLnNldChzY2FsZS54LCAxLCBzY2FsZS56KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnVwZGF0ZU1hdHJpeFdvcmxkKHRydWUpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG9iamVjdCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgKCkgPT4ge30sXHJcbiAgICAgICAgICAgICAgICByZWplY3RcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHtNYXRoVXRpbHMsIFZlY3RvcjMsIFZlY3RvcjR9IGZyb20gXCJ0aHJlZVwiO1xyXG5pbXBvcnQge2FuaW1hdGUsIGRpc3BhdGNoRXZlbnR9IGZyb20gXCIuLi91dGlsL1V0aWxzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTWFya2VyIHtcclxuXHJcbiAgICBzdGF0aWMgU291cmNlID0ge1xyXG4gICAgICAgIENVU1RPTTogMCxcclxuICAgICAgICBNQVJLRVJfRklMRTogMVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKG1hcmtlclNldCwgaWQpIHtcclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2lzTWFya2VyJywge3ZhbHVlOiB0cnVlfSk7XHJcblxyXG4gICAgICAgIHRoaXMubWFuYWdlciA9IG1hcmtlclNldC5tYW5hZ2VyO1xyXG4gICAgICAgIHRoaXMubWFya2VyU2V0ID0gbWFya2VyU2V0O1xyXG4gICAgICAgIHRoaXMuaWQgPSBpZDtcclxuXHJcbiAgICAgICAgdGhpcy5fcG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xyXG5cclxuICAgICAgICB0aGlzLl9sYWJlbCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5saW5rID0gbnVsbDtcclxuICAgICAgICB0aGlzLm5ld1RhYiA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMubWluRGlzdGFuY2UgPSAwLjA7XHJcbiAgICAgICAgdGhpcy5tYXhEaXN0YW5jZSA9IDEwMDAwMC4wO1xyXG5cclxuICAgICAgICB0aGlzLm9wYWNpdHkgPSAxO1xyXG5cclxuICAgICAgICB0aGlzLl9zb3VyY2UgPSBNYXJrZXIuU291cmNlLkNVU1RPTTtcclxuXHJcbiAgICAgICAgdGhpcy5fb25EaXNwb3NhbCA9IFtdO1xyXG5cclxuICAgICAgICB0aGlzLl9kaXN0YW5jZSA9IDA7XHJcbiAgICAgICAgdGhpcy5fb3BhY2l0eSA9IDE7XHJcblxyXG4gICAgICAgIHRoaXMuX3Bvc1JlbGF0aXZlVG9DYW1lcmEgPSBuZXcgVmVjdG9yMygpO1xyXG4gICAgICAgIHRoaXMuX2NhbWVyYURpcmVjdGlvbiA9IG5ldyBWZWN0b3IzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlKG1hcmtlckRhdGEpIHtcclxuICAgICAgICB0aGlzLl9zb3VyY2UgPSBNYXJrZXIuU291cmNlLk1BUktFUl9GSUxFO1xyXG5cclxuICAgICAgICBpZiAobWFya2VyRGF0YS5wb3NpdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLnNldFBvc2l0aW9uKHBhcnNlRmxvYXQobWFya2VyRGF0YS5wb3NpdGlvbi54KSwgcGFyc2VGbG9hdChtYXJrZXJEYXRhLnBvc2l0aW9uLnkpLCBwYXJzZUZsb2F0KG1hcmtlckRhdGEucG9zaXRpb24ueikpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0UG9zaXRpb24oMCwgMCwgMCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmxhYmVsID0gbWFya2VyRGF0YS5sYWJlbCA/IG1hcmtlckRhdGEubGFiZWwgOiBudWxsO1xyXG4gICAgICAgIHRoaXMubGluayA9IG1hcmtlckRhdGEubGluayA/IG1hcmtlckRhdGEubGluayA6IG51bGw7XHJcbiAgICAgICAgdGhpcy5uZXdUYWIgPSAhIW1hcmtlckRhdGEubmV3VGFiO1xyXG5cclxuICAgICAgICB0aGlzLm1pbkRpc3RhbmNlID0gcGFyc2VGbG9hdChtYXJrZXJEYXRhLm1pbkRpc3RhbmNlID8gbWFya2VyRGF0YS5taW5EaXN0YW5jZSA6IDAuMCk7XHJcbiAgICAgICAgdGhpcy5tYXhEaXN0YW5jZSA9IHBhcnNlRmxvYXQobWFya2VyRGF0YS5tYXhEaXN0YW5jZSA/IG1hcmtlckRhdGEubWF4RGlzdGFuY2UgOiAxMDAwMDAuMCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0UG9zaXRpb24oeCwgeSwgeikge1xyXG4gICAgICAgIHRoaXMucG9zaXRpb24uc2V0KHgsIHksIHopO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBwb3NpdGlvbigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcG9zaXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgb25DbGljayhjbGlja1Bvc2l0aW9uKXtcclxuICAgICAgICBpZiAoIWRpc3BhdGNoRXZlbnQodGhpcy5tYW5hZ2VyLmV2ZW50cywgJ2JsdWVtYXBNYXJrZXJDbGljaycsIHttYXJrZXI6IHRoaXN9KSkgcmV0dXJuO1xyXG5cclxuICAgICAgICB0aGlzLmZvbGxvd0xpbmsoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMubGFiZWwpe1xyXG4gICAgICAgICAgICB0aGlzLm1hbmFnZXIuc2hvd1BvcHVwKGA8ZGl2IGNsYXNzPVwiYm0tbWFya2VyLWxhYmVsXCI+JHt0aGlzLmxhYmVsfTwvZGl2PmAsIGNsaWNrUG9zaXRpb24ueCwgY2xpY2tQb3NpdGlvbi55LCBjbGlja1Bvc2l0aW9uLnosIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmb2xsb3dMaW5rKCl7XHJcbiAgICAgICAgaWYgKHRoaXMubGluayl7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm5ld1RhYil7XHJcbiAgICAgICAgICAgICAgICB3aW5kb3cub3Blbih0aGlzLmxpbmssICdfYmxhbmsnKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGxvY2F0aW9uLmhyZWYgPSB0aGlzLmxpbms7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgX29uQmVmb3JlUmVuZGVyKHJlbmRlcmVyLCBzY2VuZSwgY2FtZXJhKSB7XHJcblxyXG4gICAgICAgIC8vY2FsY3VsYXRlIFwib3J0aG9ncmFwaGljIGRpc3RhbmNlXCIgdG8gbWFya2VyXHJcbiAgICAgICAgdGhpcy5fcG9zUmVsYXRpdmVUb0NhbWVyYS5zdWJWZWN0b3JzKHRoaXMucG9zaXRpb24sIGNhbWVyYS5wb3NpdGlvbik7XHJcbiAgICAgICAgY2FtZXJhLmdldFdvcmxkRGlyZWN0aW9uKHRoaXMuX2NhbWVyYURpcmVjdGlvbik7XHJcbiAgICAgICAgdGhpcy5fZGlzdGFuY2UgPSB0aGlzLl9wb3NSZWxhdGl2ZVRvQ2FtZXJhLmRvdCh0aGlzLl9jYW1lcmFEaXJlY3Rpb24pO1xyXG5cclxuICAgICAgICAvL2NhbGN1bGF0ZSBvcGFjaXR5IGJhc2VkIG9uIChtaW4vbWF4KWRpc3RhbmNlXHJcbiAgICAgICAgdGhpcy5fb3BhY2l0eSA9IE1hdGgubWluKFxyXG4gICAgICAgICAgICAxIC0gTWF0aFV0aWxzLmNsYW1wKCh0aGlzLl9kaXN0YW5jZSAtIHRoaXMubWF4RGlzdGFuY2UpIC8gKHRoaXMubWF4RGlzdGFuY2UgKiAyKSwgMCwgMSksXHJcbiAgICAgICAgICAgIE1hdGhVdGlscy5jbGFtcCgodGhpcy5fZGlzdGFuY2UgLSB0aGlzLm1pbkRpc3RhbmNlKSAvICh0aGlzLm1pbkRpc3RhbmNlICogMiArIDEpLCAwLCAxKVxyXG4gICAgICAgICkgKiB0aGlzLm9wYWNpdHk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGJsZW5kSW4oZHVyYXRpb25NcyA9IDUwMCwgcG9zdEFuaW1hdGlvbiA9IG51bGwpe1xyXG4gICAgICAgIHRoaXMub3BhY2l0eSA9IDA7XHJcbiAgICAgICAgYW5pbWF0ZShwcm9ncmVzcyA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMub3BhY2l0eSA9IHByb2dyZXNzO1xyXG4gICAgICAgIH0sIGR1cmF0aW9uTXMsIHBvc3RBbmltYXRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIGJsZW5kT3V0KGR1cmF0aW9uTXMgPSA1MDAsIHBvc3RBbmltYXRpb24gPSBudWxsKXtcclxuICAgICAgICBsZXQgc3RhcnRPcGFjaXR5ID0gdGhpcy5vcGFjaXR5O1xyXG4gICAgICAgIGFuaW1hdGUocHJvZ3Jlc3MgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLm9wYWNpdHkgPSBzdGFydE9wYWNpdHkgKiAoMSAtIHByb2dyZXNzKTtcclxuICAgICAgICB9LCBkdXJhdGlvbk1zLCBwb3N0QW5pbWF0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXQgbGFiZWwobGFiZWwpe1xyXG4gICAgICAgIHRoaXMuX2xhYmVsID0gbGFiZWw7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGxhYmVsKCl7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhYmVsO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBvbkRpc3Bvc2FsKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgdGhpcy5fb25EaXNwb3NhbC5wdXNoKGNhbGxiYWNrKTtcclxuICAgIH1cclxuXHJcbiAgICBkaXNwb3NlKCkge1xyXG4gICAgICAgIHRoaXMuX29uRGlzcG9zYWwuZm9yRWFjaChjYWxsYmFjayA9PiBjYWxsYmFjayh0aGlzKSk7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMubWFya2VyU2V0Ll9tYXJrZXJbdGhpcy5pZF07XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIG5vcm1hbGl6ZUNvbG9yKGNvbG9yKXtcclxuICAgICAgICBpZiAoIWNvbG9yKSBjb2xvciA9IHt9O1xyXG5cclxuICAgICAgICBjb2xvci5yID0gTWFya2VyLm5vcm1hbGlzZU51bWJlcihjb2xvci5yLCAyNTUsIHRydWUpO1xyXG4gICAgICAgIGNvbG9yLmcgPSBNYXJrZXIubm9ybWFsaXNlTnVtYmVyKGNvbG9yLmcsIDAsIHRydWUpO1xyXG4gICAgICAgIGNvbG9yLmIgPSBNYXJrZXIubm9ybWFsaXNlTnVtYmVyKGNvbG9yLmIsIDAsIHRydWUpO1xyXG4gICAgICAgIGNvbG9yLmEgPSBNYXJrZXIubm9ybWFsaXNlTnVtYmVyKGNvbG9yLmEsIDEsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgY29sb3IucmdiID0gKGNvbG9yLnIgPDwgMTYpICsgKGNvbG9yLmcgPDwgOCkgKyAoY29sb3IuYik7XHJcbiAgICAgICAgY29sb3IudmVjNCA9IG5ldyBWZWN0b3I0KGNvbG9yLnIgLyAyNTUsIGNvbG9yLmcgLyAyNTUsIGNvbG9yLmIgLyAyNTUsIGNvbG9yLmEpO1xyXG4gICAgICAgIHJldHVybiBjb2xvcjtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgbm9ybWFsaXNlTnVtYmVyKG5yLCBkZWYsIGludGVnZXIgPSBmYWxzZSkge1xyXG4gICAgICAgIGlmIChpc05hTihucikpe1xyXG4gICAgICAgICAgICBpZiAoaW50ZWdlcikgbnIgPSBwYXJzZUludChucik7XHJcbiAgICAgICAgICAgIGVsc2UgbnIgPSBwYXJzZUZsb2F0KG5yKTtcclxuICAgICAgICAgICAgaWYgKGlzTmFOKG5yKSkgcmV0dXJuIGRlZjtcclxuICAgICAgICAgICAgcmV0dXJuIG5yO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGludGVnZXIpIHJldHVybiBNYXRoLmZsb29yKG5yKTtcclxuICAgICAgICByZXR1cm4gbnI7XHJcbiAgICB9XHJcblxyXG59IiwiaW1wb3J0IHtcblx0U2hhZGVyTGliLFxuXHRTaGFkZXJNYXRlcmlhbCxcblx0VW5pZm9ybXNMaWIsXG5cdFVuaWZvcm1zVXRpbHMsXG5cdFZlY3RvcjJcbn0gZnJvbSBcInRocmVlXCI7XG4vKipcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgY29sb3I6IDxoZXg+LFxuICogIGxpbmV3aWR0aDogPGZsb2F0PixcbiAqICBkYXNoZWQ6IDxib29sZWFuPixcbiAqICBkYXNoU2NhbGU6IDxmbG9hdD4sXG4gKiAgZGFzaFNpemU6IDxmbG9hdD4sXG4gKiAgZ2FwU2l6ZTogPGZsb2F0PixcbiAqICByZXNvbHV0aW9uOiA8VmVjdG9yMj4sIC8vIHRvIGJlIHNldCBieSByZW5kZXJlclxuICogfVxuICovXG5cblVuaWZvcm1zTGliLmxpbmUgPSB7XG5cblx0bGluZXdpZHRoOiB7IHZhbHVlOiAxIH0sXG5cdHJlc29sdXRpb246IHsgdmFsdWU6IG5ldyBWZWN0b3IyKCAxLCAxICkgfSxcblx0ZGFzaFNjYWxlOiB7IHZhbHVlOiAxIH0sXG5cdGRhc2hTaXplOiB7IHZhbHVlOiAxIH0sXG5cdGdhcFNpemU6IHsgdmFsdWU6IDEgfSwgLy8gdG9kbyBGSVggLSBtYXliZSBjaGFuZ2UgdG8gdG90YWxTaXplXG5cdG9wYWNpdHk6IHsgdmFsdWU6IDEgfVxuXG59O1xuXG5TaGFkZXJMaWJbICdsaW5lJyBdID0ge1xuXG5cdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbXG5cdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxuXHRcdFVuaWZvcm1zTGliLmZvZyxcblx0XHRVbmlmb3Jtc0xpYi5saW5lXG5cdF0gKSxcblxuXHR2ZXJ0ZXhTaGFkZXI6XG5cdFx0YFxuXHRcdCNpbmNsdWRlIDxjb21tb24+XG5cdFx0I2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxuXHRcdCNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XG5cdFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxuXHRcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XG5cblx0XHR1bmlmb3JtIGZsb2F0IGxpbmV3aWR0aDtcblx0XHR1bmlmb3JtIHZlYzIgcmVzb2x1dGlvbjtcblxuXHRcdGF0dHJpYnV0ZSB2ZWMzIGluc3RhbmNlU3RhcnQ7XG5cdFx0YXR0cmlidXRlIHZlYzMgaW5zdGFuY2VFbmQ7XG5cblx0XHRhdHRyaWJ1dGUgdmVjMyBpbnN0YW5jZUNvbG9yU3RhcnQ7XG5cdFx0YXR0cmlidXRlIHZlYzMgaW5zdGFuY2VDb2xvckVuZDtcblxuXHRcdHZhcnlpbmcgdmVjMiB2VXY7XG5cblx0XHQjaWZkZWYgVVNFX0RBU0hcblxuXHRcdFx0dW5pZm9ybSBmbG9hdCBkYXNoU2NhbGU7XG5cdFx0XHRhdHRyaWJ1dGUgZmxvYXQgaW5zdGFuY2VEaXN0YW5jZVN0YXJ0O1xuXHRcdFx0YXR0cmlidXRlIGZsb2F0IGluc3RhbmNlRGlzdGFuY2VFbmQ7XG5cdFx0XHR2YXJ5aW5nIGZsb2F0IHZMaW5lRGlzdGFuY2U7XG5cblx0XHQjZW5kaWZcblxuXHRcdHZvaWQgdHJpbVNlZ21lbnQoIGNvbnN0IGluIHZlYzQgc3RhcnQsIGlub3V0IHZlYzQgZW5kICkge1xuXG5cdFx0XHQvLyB0cmltIGVuZCBzZWdtZW50IHNvIGl0IHRlcm1pbmF0ZXMgYmV0d2VlbiB0aGUgY2FtZXJhIHBsYW5lIGFuZCB0aGUgbmVhciBwbGFuZVxuXG5cdFx0XHQvLyBjb25zZXJ2YXRpdmUgZXN0aW1hdGUgb2YgdGhlIG5lYXIgcGxhbmVcblx0XHRcdGZsb2F0IGEgPSBwcm9qZWN0aW9uTWF0cml4WyAyIF1bIDIgXTsgLy8gM25kIGVudHJ5IGluIDN0aCBjb2x1bW5cblx0XHRcdGZsb2F0IGIgPSBwcm9qZWN0aW9uTWF0cml4WyAzIF1bIDIgXTsgLy8gM25kIGVudHJ5IGluIDR0aCBjb2x1bW5cblx0XHRcdGZsb2F0IG5lYXJFc3RpbWF0ZSA9IC0gMC41ICogYiAvIGE7XG5cblx0XHRcdGZsb2F0IGFscGhhID0gKCBuZWFyRXN0aW1hdGUgLSBzdGFydC56ICkgLyAoIGVuZC56IC0gc3RhcnQueiApO1xuXG5cdFx0XHRlbmQueHl6ID0gbWl4KCBzdGFydC54eXosIGVuZC54eXosIGFscGhhICk7XG5cblx0XHR9XG5cblx0XHR2b2lkIG1haW4oKSB7XG5cblx0XHRcdCNpZmRlZiBVU0VfQ09MT1JcblxuXHRcdFx0XHR2Q29sb3IueHl6ID0gKCBwb3NpdGlvbi55IDwgMC41ICkgPyBpbnN0YW5jZUNvbG9yU3RhcnQgOiBpbnN0YW5jZUNvbG9yRW5kO1xuXG5cdFx0XHQjZW5kaWZcblxuXHRcdFx0I2lmZGVmIFVTRV9EQVNIXG5cblx0XHRcdFx0dkxpbmVEaXN0YW5jZSA9ICggcG9zaXRpb24ueSA8IDAuNSApID8gZGFzaFNjYWxlICogaW5zdGFuY2VEaXN0YW5jZVN0YXJ0IDogZGFzaFNjYWxlICogaW5zdGFuY2VEaXN0YW5jZUVuZDtcblxuXHRcdFx0I2VuZGlmXG5cblx0XHRcdGZsb2F0IGFzcGVjdCA9IHJlc29sdXRpb24ueCAvIHJlc29sdXRpb24ueTtcblxuXHRcdFx0dlV2ID0gdXY7XG5cblx0XHRcdC8vIGNhbWVyYSBzcGFjZVxuXHRcdFx0dmVjNCBzdGFydCA9IG1vZGVsVmlld01hdHJpeCAqIHZlYzQoIGluc3RhbmNlU3RhcnQsIDEuMCApO1xuXHRcdFx0dmVjNCBlbmQgPSBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCBpbnN0YW5jZUVuZCwgMS4wICk7XG5cblx0XHRcdC8vIHNwZWNpYWwgY2FzZSBmb3IgcGVyc3BlY3RpdmUgcHJvamVjdGlvbiwgYW5kIHNlZ21lbnRzIHRoYXQgdGVybWluYXRlIGVpdGhlciBpbiwgb3IgYmVoaW5kLCB0aGUgY2FtZXJhIHBsYW5lXG5cdFx0XHQvLyBjbGVhcmx5IHRoZSBncHUgZmlybXdhcmUgaGFzIGEgd2F5IG9mIGFkZHJlc3NpbmcgdGhpcyBpc3N1ZSB3aGVuIHByb2plY3RpbmcgaW50byBuZGMgc3BhY2Vcblx0XHRcdC8vIGJ1dCB3ZSBuZWVkIHRvIHBlcmZvcm0gbmRjLXNwYWNlIGNhbGN1bGF0aW9ucyBpbiB0aGUgc2hhZGVyLCBzbyB3ZSBtdXN0IGFkZHJlc3MgdGhpcyBpc3N1ZSBkaXJlY3RseVxuXHRcdFx0Ly8gcGVyaGFwcyB0aGVyZSBpcyBhIG1vcmUgZWxlZ2FudCBzb2x1dGlvbiAtLSBXZXN0TGFuZ2xleVxuXG5cdFx0XHRib29sIHBlcnNwZWN0aXZlID0gKCBwcm9qZWN0aW9uTWF0cml4WyAyIF1bIDMgXSA9PSAtIDEuMCApOyAvLyA0dGggZW50cnkgaW4gdGhlIDNyZCBjb2x1bW5cblxuXHRcdFx0aWYgKCBwZXJzcGVjdGl2ZSApIHtcblxuXHRcdFx0XHRpZiAoIHN0YXJ0LnogPCAwLjAgJiYgZW5kLnogPj0gMC4wICkge1xuXG5cdFx0XHRcdFx0dHJpbVNlZ21lbnQoIHN0YXJ0LCBlbmQgKTtcblxuXHRcdFx0XHR9IGVsc2UgaWYgKCBlbmQueiA8IDAuMCAmJiBzdGFydC56ID49IDAuMCApIHtcblxuXHRcdFx0XHRcdHRyaW1TZWdtZW50KCBlbmQsIHN0YXJ0ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGNsaXAgc3BhY2Vcblx0XHRcdHZlYzQgY2xpcFN0YXJ0ID0gcHJvamVjdGlvbk1hdHJpeCAqIHN0YXJ0O1xuXHRcdFx0dmVjNCBjbGlwRW5kID0gcHJvamVjdGlvbk1hdHJpeCAqIGVuZDtcblxuXHRcdFx0Ly8gbmRjIHNwYWNlXG5cdFx0XHR2ZWMyIG5kY1N0YXJ0ID0gY2xpcFN0YXJ0Lnh5IC8gY2xpcFN0YXJ0Lnc7XG5cdFx0XHR2ZWMyIG5kY0VuZCA9IGNsaXBFbmQueHkgLyBjbGlwRW5kLnc7XG5cblx0XHRcdC8vIGRpcmVjdGlvblxuXHRcdFx0dmVjMiBkaXIgPSBuZGNFbmQgLSBuZGNTdGFydDtcblxuXHRcdFx0Ly8gYWNjb3VudCBmb3IgY2xpcC1zcGFjZSBhc3BlY3QgcmF0aW9cblx0XHRcdGRpci54ICo9IGFzcGVjdDtcblx0XHRcdGRpciA9IG5vcm1hbGl6ZSggZGlyICk7XG5cblx0XHRcdC8vIHBlcnBlbmRpY3VsYXIgdG8gZGlyXG5cdFx0XHR2ZWMyIG9mZnNldCA9IHZlYzIoIGRpci55LCAtIGRpci54ICk7XG5cblx0XHRcdC8vIHVuZG8gYXNwZWN0IHJhdGlvIGFkanVzdG1lbnRcblx0XHRcdGRpci54IC89IGFzcGVjdDtcblx0XHRcdG9mZnNldC54IC89IGFzcGVjdDtcblxuXHRcdFx0Ly8gc2lnbiBmbGlwXG5cdFx0XHRpZiAoIHBvc2l0aW9uLnggPCAwLjAgKSBvZmZzZXQgKj0gLSAxLjA7XG5cblx0XHRcdC8vIGVuZGNhcHNcblx0XHRcdGlmICggcG9zaXRpb24ueSA8IDAuMCApIHtcblxuXHRcdFx0XHRvZmZzZXQgKz0gLSBkaXI7XG5cblx0XHRcdH0gZWxzZSBpZiAoIHBvc2l0aW9uLnkgPiAxLjAgKSB7XG5cblx0XHRcdFx0b2Zmc2V0ICs9IGRpcjtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBhZGp1c3QgZm9yIGxpbmV3aWR0aFxuXHRcdFx0b2Zmc2V0ICo9IGxpbmV3aWR0aDtcblxuXHRcdFx0Ly8gYWRqdXN0IGZvciBjbGlwLXNwYWNlIHRvIHNjcmVlbi1zcGFjZSBjb252ZXJzaW9uIC8vIG1heWJlIHJlc29sdXRpb24gc2hvdWxkIGJlIGJhc2VkIG9uIHZpZXdwb3J0IC4uLlxuXHRcdFx0b2Zmc2V0IC89IHJlc29sdXRpb24ueTtcblxuXHRcdFx0Ly8gc2VsZWN0IGVuZFxuXHRcdFx0dmVjNCBjbGlwID0gKCBwb3NpdGlvbi55IDwgMC41ICkgPyBjbGlwU3RhcnQgOiBjbGlwRW5kO1xuXG5cdFx0XHQvLyBiYWNrIHRvIGNsaXAgc3BhY2Vcblx0XHRcdG9mZnNldCAqPSBjbGlwLnc7XG5cblx0XHRcdGNsaXAueHkgKz0gb2Zmc2V0O1xuXG5cdFx0XHRnbF9Qb3NpdGlvbiA9IGNsaXA7XG5cblx0XHRcdHZlYzQgbXZQb3NpdGlvbiA9ICggcG9zaXRpb24ueSA8IDAuNSApID8gc3RhcnQgOiBlbmQ7IC8vIHRoaXMgaXMgYW4gYXBwcm94aW1hdGlvblxuXG5cdFx0XHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxuXHRcdFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XG5cdFx0XHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cblxuXHRcdH1cblx0XHRgLFxuXG5cdGZyYWdtZW50U2hhZGVyOlxuXHRcdGBcblx0XHR1bmlmb3JtIHZlYzMgZGlmZnVzZTtcblx0XHR1bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG5cblx0XHQjaWZkZWYgVVNFX0RBU0hcblxuXHRcdFx0dW5pZm9ybSBmbG9hdCBkYXNoU2l6ZTtcblx0XHRcdHVuaWZvcm0gZmxvYXQgZ2FwU2l6ZTtcblxuXHRcdCNlbmRpZlxuXG5cdFx0dmFyeWluZyBmbG9hdCB2TGluZURpc3RhbmNlO1xuXG5cdFx0I2luY2x1ZGUgPGNvbW1vbj5cblx0XHQjaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cblx0XHQjaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XG5cdFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XG5cdFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxuXG5cdFx0dmFyeWluZyB2ZWMyIHZVdjtcblxuXHRcdHZvaWQgbWFpbigpIHtcblxuXHRcdFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cblxuXHRcdFx0I2lmZGVmIFVTRV9EQVNIXG5cblx0XHRcdFx0aWYgKCB2VXYueSA8IC0gMS4wIHx8IHZVdi55ID4gMS4wICkgZGlzY2FyZDsgLy8gZGlzY2FyZCBlbmRjYXBzXG5cblx0XHRcdFx0aWYgKCBtb2QoIHZMaW5lRGlzdGFuY2UsIGRhc2hTaXplICsgZ2FwU2l6ZSApID4gZGFzaFNpemUgKSBkaXNjYXJkOyAvLyB0b2RvIC0gRklYXG5cblx0XHRcdCNlbmRpZlxuXG5cdFx0XHRpZiAoIGFicyggdlV2LnkgKSA+IDEuMCApIHtcblxuXHRcdFx0XHRmbG9hdCBhID0gdlV2Lng7XG5cdFx0XHRcdGZsb2F0IGIgPSAoIHZVdi55ID4gMC4wICkgPyB2VXYueSAtIDEuMCA6IHZVdi55ICsgMS4wO1xuXHRcdFx0XHRmbG9hdCBsZW4yID0gYSAqIGEgKyBiICogYjtcblxuXHRcdFx0XHRpZiAoIGxlbjIgPiAxLjAgKSBkaXNjYXJkO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXG5cdFx0XHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XG5cdFx0XHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XG5cblx0XHRcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIGRpZmZ1c2VDb2xvci5yZ2IsIGRpZmZ1c2VDb2xvci5hICk7XG5cblx0XHRcdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cblx0XHRcdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XG5cdFx0XHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PlxuXHRcdFx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XG5cblx0XHR9XG5cdFx0YFxufTtcblxudmFyIExpbmVNYXRlcmlhbCA9IGZ1bmN0aW9uICggcGFyYW1ldGVycyApIHtcblxuXHRTaGFkZXJNYXRlcmlhbC5jYWxsKCB0aGlzLCB7XG5cblx0XHR0eXBlOiAnTGluZU1hdGVyaWFsJyxcblxuXHRcdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLmNsb25lKCBTaGFkZXJMaWJbICdsaW5lJyBdLnVuaWZvcm1zICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckxpYlsgJ2xpbmUnIF0udmVydGV4U2hhZGVyLFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJMaWJbICdsaW5lJyBdLmZyYWdtZW50U2hhZGVyLFxuXG5cdFx0Y2xpcHBpbmc6IHRydWUgLy8gcmVxdWlyZWQgZm9yIGNsaXBwaW5nIHN1cHBvcnRcblxuXHR9ICk7XG5cblx0dGhpcy5kYXNoZWQgPSBmYWxzZTtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydGllcyggdGhpcywge1xuXG5cdFx0Y29sb3I6IHtcblxuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblxuXHRcdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0cmV0dXJuIHRoaXMudW5pZm9ybXMuZGlmZnVzZS52YWx1ZTtcblxuXHRcdFx0fSxcblxuXHRcdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRcdHRoaXMudW5pZm9ybXMuZGlmZnVzZS52YWx1ZSA9IHZhbHVlO1xuXG5cdFx0XHR9XG5cblx0XHR9LFxuXG5cdFx0bGluZXdpZHRoOiB7XG5cblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cblx0XHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdHJldHVybiB0aGlzLnVuaWZvcm1zLmxpbmV3aWR0aC52YWx1ZTtcblxuXHRcdFx0fSxcblxuXHRcdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRcdHRoaXMudW5pZm9ybXMubGluZXdpZHRoLnZhbHVlID0gdmFsdWU7XG5cblx0XHRcdH1cblxuXHRcdH0sXG5cblx0XHRkYXNoU2NhbGU6IHtcblxuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblxuXHRcdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0cmV0dXJuIHRoaXMudW5pZm9ybXMuZGFzaFNjYWxlLnZhbHVlO1xuXG5cdFx0XHR9LFxuXG5cdFx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdFx0dGhpcy51bmlmb3Jtcy5kYXNoU2NhbGUudmFsdWUgPSB2YWx1ZTtcblxuXHRcdFx0fVxuXG5cdFx0fSxcblxuXHRcdGRhc2hTaXplOiB7XG5cblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cblx0XHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdHJldHVybiB0aGlzLnVuaWZvcm1zLmRhc2hTaXplLnZhbHVlO1xuXG5cdFx0XHR9LFxuXG5cdFx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdFx0dGhpcy51bmlmb3Jtcy5kYXNoU2l6ZS52YWx1ZSA9IHZhbHVlO1xuXG5cdFx0XHR9XG5cblx0XHR9LFxuXG5cdFx0Z2FwU2l6ZToge1xuXG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXG5cdFx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRyZXR1cm4gdGhpcy51bmlmb3Jtcy5nYXBTaXplLnZhbHVlO1xuXG5cdFx0XHR9LFxuXG5cdFx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdFx0dGhpcy51bmlmb3Jtcy5nYXBTaXplLnZhbHVlID0gdmFsdWU7XG5cblx0XHRcdH1cblxuXHRcdH0sXG5cblx0XHRvcGFjaXR5OiB7XG5cblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cblx0XHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdHJldHVybiB0aGlzLnVuaWZvcm1zLm9wYWNpdHkudmFsdWU7XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0XHR0aGlzLnVuaWZvcm1zLm9wYWNpdHkudmFsdWUgPSB2YWx1ZTtcblxuXHRcdFx0fVxuXG5cdFx0fSxcblxuXHRcdHJlc29sdXRpb246IHtcblxuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblxuXHRcdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0cmV0dXJuIHRoaXMudW5pZm9ybXMucmVzb2x1dGlvbi52YWx1ZTtcblxuXHRcdFx0fSxcblxuXHRcdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRcdHRoaXMudW5pZm9ybXMucmVzb2x1dGlvbi52YWx1ZS5jb3B5KCB2YWx1ZSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSApO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn07XG5cbkxpbmVNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBTaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUgKTtcbkxpbmVNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMaW5lTWF0ZXJpYWw7XG5cbkxpbmVNYXRlcmlhbC5wcm90b3R5cGUuaXNMaW5lTWF0ZXJpYWwgPSB0cnVlO1xuXG5leHBvcnQgeyBMaW5lTWF0ZXJpYWwgfTtcbiIsImltcG9ydCB7XG5cdEJveDMsXG5cdEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUsXG5cdEluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5LFxuXHRJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlcixcblx0SW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUsXG5cdFNwaGVyZSxcblx0VmVjdG9yMyxcblx0V2lyZWZyYW1lR2VvbWV0cnlcbn0gZnJvbSBcInRocmVlXCI7XG5cbnZhciBMaW5lU2VnbWVudHNHZW9tZXRyeSA9IGZ1bmN0aW9uICgpIHtcblxuXHRJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0xpbmVTZWdtZW50c0dlb21ldHJ5JztcblxuXHR2YXIgcG9zaXRpb25zID0gWyAtIDEsIDIsIDAsIDEsIDIsIDAsIC0gMSwgMSwgMCwgMSwgMSwgMCwgLSAxLCAwLCAwLCAxLCAwLCAwLCAtIDEsIC0gMSwgMCwgMSwgLSAxLCAwIF07XG5cdHZhciB1dnMgPSBbIC0gMSwgMiwgMSwgMiwgLSAxLCAxLCAxLCAxLCAtIDEsIC0gMSwgMSwgLSAxLCAtIDEsIC0gMiwgMSwgLSAyIF07XG5cdHZhciBpbmRleCA9IFsgMCwgMiwgMSwgMiwgMywgMSwgMiwgNCwgMywgNCwgNSwgMywgNCwgNiwgNSwgNiwgNywgNSBdO1xuXG5cdHRoaXMuc2V0SW5kZXgoIGluZGV4ICk7XG5cdHRoaXMuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25zLCAzICkgKTtcblx0dGhpcy5zZXRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG59O1xuXG5MaW5lU2VnbWVudHNHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBMaW5lU2VnbWVudHNHZW9tZXRyeSxcblxuXHRpc0xpbmVTZWdtZW50c0dlb21ldHJ5OiB0cnVlLFxuXG5cdGFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCBtYXRyaXggKSB7XG5cblx0XHR2YXIgc3RhcnQgPSB0aGlzLmF0dHJpYnV0ZXMuaW5zdGFuY2VTdGFydDtcblx0XHR2YXIgZW5kID0gdGhpcy5hdHRyaWJ1dGVzLmluc3RhbmNlRW5kO1xuXG5cdFx0aWYgKCBzdGFydCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRzdGFydC5hcHBseU1hdHJpeDQoIG1hdHJpeCApO1xuXG5cdFx0XHRlbmQuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTtcblxuXHRcdFx0c3RhcnQubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmJvdW5kaW5nQm94ICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmJvdW5kaW5nU3BoZXJlICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRQb3NpdGlvbnM6IGZ1bmN0aW9uICggYXJyYXkgKSB7XG5cblx0XHR2YXIgbGluZVNlZ21lbnRzO1xuXG5cdFx0aWYgKCBhcnJheSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSApIHtcblxuXHRcdFx0bGluZVNlZ21lbnRzID0gYXJyYXk7XG5cblx0XHR9IGVsc2UgaWYgKCBBcnJheS5pc0FycmF5KCBhcnJheSApICkge1xuXG5cdFx0XHRsaW5lU2VnbWVudHMgPSBuZXcgRmxvYXQzMkFycmF5KCBhcnJheSApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGluc3RhbmNlQnVmZmVyID0gbmV3IEluc3RhbmNlZEludGVybGVhdmVkQnVmZmVyKCBsaW5lU2VnbWVudHMsIDYsIDEgKTsgLy8geHl6LCB4eXpcblxuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAnaW5zdGFuY2VTdGFydCcsIG5ldyBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSggaW5zdGFuY2VCdWZmZXIsIDMsIDAgKSApOyAvLyB4eXpcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ2luc3RhbmNlRW5kJywgbmV3IEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKCBpbnN0YW5jZUJ1ZmZlciwgMywgMyApICk7IC8vIHh5elxuXG5cdFx0Ly9cblxuXHRcdHRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCk7XG5cdFx0dGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0Q29sb3JzOiBmdW5jdGlvbiAoIGFycmF5ICkge1xuXG5cdFx0dmFyIGNvbG9ycztcblxuXHRcdGlmICggYXJyYXkgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkgKSB7XG5cblx0XHRcdGNvbG9ycyA9IGFycmF5O1xuXG5cdFx0fSBlbHNlIGlmICggQXJyYXkuaXNBcnJheSggYXJyYXkgKSApIHtcblxuXHRcdFx0Y29sb3JzID0gbmV3IEZsb2F0MzJBcnJheSggYXJyYXkgKTtcblxuXHRcdH1cblxuXHRcdHZhciBpbnN0YW5jZUNvbG9yQnVmZmVyID0gbmV3IEluc3RhbmNlZEludGVybGVhdmVkQnVmZmVyKCBjb2xvcnMsIDYsIDEgKTsgLy8gcmdiLCByZ2JcblxuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAnaW5zdGFuY2VDb2xvclN0YXJ0JywgbmV3IEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKCBpbnN0YW5jZUNvbG9yQnVmZmVyLCAzLCAwICkgKTsgLy8gcmdiXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdpbnN0YW5jZUNvbG9yRW5kJywgbmV3IEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKCBpbnN0YW5jZUNvbG9yQnVmZmVyLCAzLCAzICkgKTsgLy8gcmdiXG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGZyb21XaXJlZnJhbWVHZW9tZXRyeTogZnVuY3Rpb24gKCBnZW9tZXRyeSApIHtcblxuXHRcdHRoaXMuc2V0UG9zaXRpb25zKCBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGZyb21FZGdlc0dlb21ldHJ5OiBmdW5jdGlvbiAoIGdlb21ldHJ5ICkge1xuXG5cdFx0dGhpcy5zZXRQb3NpdGlvbnMoIGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24uYXJyYXkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZnJvbU1lc2g6IGZ1bmN0aW9uICggbWVzaCApIHtcblxuXHRcdHRoaXMuZnJvbVdpcmVmcmFtZUdlb21ldHJ5KCBuZXcgV2lyZWZyYW1lR2VvbWV0cnkoIG1lc2guZ2VvbWV0cnkgKSApO1xuXG5cdFx0Ly8gc2V0IGNvbG9ycywgbWF5YmVcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZnJvbUxpbmVTZWdtZW50czogZnVuY3Rpb24gKCBsaW5lU2VnbWVudHMgKSB7XG5cblx0XHR2YXIgZ2VvbWV0cnkgPSBsaW5lU2VnbWVudHMuZ2VvbWV0cnk7XG5cblx0XHRpZiAoIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRcdHRoaXMuc2V0UG9zaXRpb25zKCBnZW9tZXRyeS52ZXJ0aWNlcyApO1xuXG5cdFx0fSBlbHNlIGlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0dGhpcy5zZXRQb3NpdGlvbnMoIGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24uYXJyYXkgKTsgLy8gYXNzdW1lcyBub24taW5kZXhlZFxuXG5cdFx0fVxuXG5cdFx0Ly8gc2V0IGNvbG9ycywgbWF5YmVcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29tcHV0ZUJvdW5kaW5nQm94OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgYm94ID0gbmV3IEJveDMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBjb21wdXRlQm91bmRpbmdCb3goKSB7XG5cblx0XHRcdGlmICggdGhpcy5ib3VuZGluZ0JveCA9PT0gbnVsbCApIHtcblxuXHRcdFx0XHR0aGlzLmJvdW5kaW5nQm94ID0gbmV3IEJveDMoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgc3RhcnQgPSB0aGlzLmF0dHJpYnV0ZXMuaW5zdGFuY2VTdGFydDtcblx0XHRcdHZhciBlbmQgPSB0aGlzLmF0dHJpYnV0ZXMuaW5zdGFuY2VFbmQ7XG5cblx0XHRcdGlmICggc3RhcnQgIT09IHVuZGVmaW5lZCAmJiBlbmQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHR0aGlzLmJvdW5kaW5nQm94LnNldEZyb21CdWZmZXJBdHRyaWJ1dGUoIHN0YXJ0ICk7XG5cblx0XHRcdFx0Ym94LnNldEZyb21CdWZmZXJBdHRyaWJ1dGUoIGVuZCApO1xuXG5cdFx0XHRcdHRoaXMuYm91bmRpbmdCb3gudW5pb24oIGJveCApO1xuXG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRjb21wdXRlQm91bmRpbmdTcGhlcmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2ZWN0b3IgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpIHtcblxuXHRcdFx0aWYgKCB0aGlzLmJvdW5kaW5nU3BoZXJlID09PSBudWxsICkge1xuXG5cdFx0XHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBuZXcgU3BoZXJlKCk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB0aGlzLmJvdW5kaW5nQm94ID09PSBudWxsICkge1xuXG5cdFx0XHRcdHRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCk7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIHN0YXJ0ID0gdGhpcy5hdHRyaWJ1dGVzLmluc3RhbmNlU3RhcnQ7XG5cdFx0XHR2YXIgZW5kID0gdGhpcy5hdHRyaWJ1dGVzLmluc3RhbmNlRW5kO1xuXG5cdFx0XHRpZiAoIHN0YXJ0ICE9PSB1bmRlZmluZWQgJiYgZW5kICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0dmFyIGNlbnRlciA9IHRoaXMuYm91bmRpbmdTcGhlcmUuY2VudGVyO1xuXG5cdFx0XHRcdHRoaXMuYm91bmRpbmdCb3guZ2V0Q2VudGVyKCBjZW50ZXIgKTtcblxuXHRcdFx0XHR2YXIgbWF4UmFkaXVzU3EgPSAwO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBzdGFydC5jb3VudDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0dmVjdG9yLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHN0YXJ0LCBpICk7XG5cdFx0XHRcdFx0bWF4UmFkaXVzU3EgPSBNYXRoLm1heCggbWF4UmFkaXVzU3EsIGNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZCggdmVjdG9yICkgKTtcblxuXHRcdFx0XHRcdHZlY3Rvci5mcm9tQnVmZmVyQXR0cmlidXRlKCBlbmQsIGkgKTtcblx0XHRcdFx0XHRtYXhSYWRpdXNTcSA9IE1hdGgubWF4KCBtYXhSYWRpdXNTcSwgY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKCB2ZWN0b3IgKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cyA9IE1hdGguc3FydCggbWF4UmFkaXVzU3EgKTtcblxuXHRcdFx0XHRpZiAoIGlzTmFOKCB0aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cyApICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkxpbmVTZWdtZW50c0dlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOiBDb21wdXRlZCByYWRpdXMgaXMgTmFOLiBUaGUgaW5zdGFuY2VkIHBvc2l0aW9uIGRhdGEgaXMgbGlrZWx5IHRvIGhhdmUgTmFOIHZhbHVlcy4nLCB0aGlzICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHRvZG9cblxuXHR9LFxuXG5cdGFwcGx5TWF0cml4OiBmdW5jdGlvbiAoIG1hdHJpeCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpbmVTZWdtZW50c0dlb21ldHJ5OiBhcHBseU1hdHJpeCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gYXBwbHlNYXRyaXg0KCkuJyApO1xuXG5cdFx0cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTtcblxuXHR9XG5cbn0gKTtcblxuZXhwb3J0IHsgTGluZVNlZ21lbnRzR2VvbWV0cnkgfTtcbiIsIlxuaW1wb3J0IHsgTGluZVNlZ21lbnRzR2VvbWV0cnkgfSBmcm9tIFwiLi9MaW5lU2VnbWVudHNHZW9tZXRyeVwiO1xuXG52YXIgTGluZUdlb21ldHJ5ID0gZnVuY3Rpb24gKCkge1xuXG5cdExpbmVTZWdtZW50c0dlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTGluZUdlb21ldHJ5JztcblxufTtcblxuTGluZUdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpbmVTZWdtZW50c0dlb21ldHJ5LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IExpbmVHZW9tZXRyeSxcblxuXHRpc0xpbmVHZW9tZXRyeTogdHJ1ZSxcblxuXHRzZXRQb3NpdGlvbnM6IGZ1bmN0aW9uICggYXJyYXkgKSB7XG5cblx0XHQvLyBjb252ZXJ0cyBbIHgxLCB5MSwgejEsICB4MiwgeTIsIHoyLCAuLi4gXSB0byBwYWlycyBmb3JtYXRcblxuXHRcdHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGggLSAzO1xuXHRcdHZhciBwb2ludHMgPSBuZXcgRmxvYXQzMkFycmF5KCAyICogbGVuZ3RoICk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMyApIHtcblxuXHRcdFx0cG9pbnRzWyAyICogaSBdID0gYXJyYXlbIGkgXTtcblx0XHRcdHBvaW50c1sgMiAqIGkgKyAxIF0gPSBhcnJheVsgaSArIDEgXTtcblx0XHRcdHBvaW50c1sgMiAqIGkgKyAyIF0gPSBhcnJheVsgaSArIDIgXTtcblxuXHRcdFx0cG9pbnRzWyAyICogaSArIDMgXSA9IGFycmF5WyBpICsgMyBdO1xuXHRcdFx0cG9pbnRzWyAyICogaSArIDQgXSA9IGFycmF5WyBpICsgNCBdO1xuXHRcdFx0cG9pbnRzWyAyICogaSArIDUgXSA9IGFycmF5WyBpICsgNSBdO1xuXG5cdFx0fVxuXG5cdFx0TGluZVNlZ21lbnRzR2VvbWV0cnkucHJvdG90eXBlLnNldFBvc2l0aW9ucy5jYWxsKCB0aGlzLCBwb2ludHMgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0Q29sb3JzOiBmdW5jdGlvbiAoIGFycmF5ICkge1xuXG5cdFx0Ly8gY29udmVydHMgWyByMSwgZzEsIGIxLCAgcjIsIGcyLCBiMiwgLi4uIF0gdG8gcGFpcnMgZm9ybWF0XG5cblx0XHR2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoIC0gMztcblx0XHR2YXIgY29sb3JzID0gbmV3IEZsb2F0MzJBcnJheSggMiAqIGxlbmd0aCApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDMgKSB7XG5cblx0XHRcdGNvbG9yc1sgMiAqIGkgXSA9IGFycmF5WyBpIF07XG5cdFx0XHRjb2xvcnNbIDIgKiBpICsgMSBdID0gYXJyYXlbIGkgKyAxIF07XG5cdFx0XHRjb2xvcnNbIDIgKiBpICsgMiBdID0gYXJyYXlbIGkgKyAyIF07XG5cblx0XHRcdGNvbG9yc1sgMiAqIGkgKyAzIF0gPSBhcnJheVsgaSArIDMgXTtcblx0XHRcdGNvbG9yc1sgMiAqIGkgKyA0IF0gPSBhcnJheVsgaSArIDQgXTtcblx0XHRcdGNvbG9yc1sgMiAqIGkgKyA1IF0gPSBhcnJheVsgaSArIDUgXTtcblxuXHRcdH1cblxuXHRcdExpbmVTZWdtZW50c0dlb21ldHJ5LnByb3RvdHlwZS5zZXRDb2xvcnMuY2FsbCggdGhpcywgY29sb3JzICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGZyb21MaW5lOiBmdW5jdGlvbiAoIGxpbmUgKSB7XG5cblx0XHR2YXIgZ2VvbWV0cnkgPSBsaW5lLmdlb21ldHJ5O1xuXG5cdFx0aWYgKCBnZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0XHR0aGlzLnNldFBvc2l0aW9ucyggZ2VvbWV0cnkudmVydGljZXMgKTtcblxuXHRcdH0gZWxzZSBpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdHRoaXMuc2V0UG9zaXRpb25zKCBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5ICk7IC8vIGFzc3VtZXMgbm9uLWluZGV4ZWRcblxuXHRcdH1cblxuXHRcdC8vIHNldCBjb2xvcnMsIG1heWJlXG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggLyogc291cmNlICovICkge1xuXG5cdFx0Ly8gdG9kb1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbmV4cG9ydCB7IExpbmVHZW9tZXRyeSB9O1xuIiwiaW1wb3J0IHtcblx0SW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIsXG5cdEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlLFxuXHRMaW5lMyxcblx0TWF0aFV0aWxzLFxuXHRNYXRyaXg0LFxuXHRNZXNoLFxuXHRWZWN0b3IzLFxuXHRWZWN0b3I0XG59IGZyb20gXCJ0aHJlZVwiO1xuaW1wb3J0IHsgTGluZVNlZ21lbnRzR2VvbWV0cnkgfSBmcm9tIFwiLi9MaW5lU2VnbWVudHNHZW9tZXRyeVwiO1xuaW1wb3J0IHsgTGluZU1hdGVyaWFsIH0gZnJvbSBcIi4vTGluZU1hdGVyaWFsXCI7XG5cbnZhciBMaW5lU2VnbWVudHMyID0gZnVuY3Rpb24gKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKSB7XG5cblx0aWYgKCBnZW9tZXRyeSA9PT0gdW5kZWZpbmVkICkgZ2VvbWV0cnkgPSBuZXcgTGluZVNlZ21lbnRzR2VvbWV0cnkoKTtcblx0aWYgKCBtYXRlcmlhbCA9PT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwgPSBuZXcgTGluZU1hdGVyaWFsKCB7IGNvbG9yOiBNYXRoLnJhbmRvbSgpICogMHhmZmZmZmYgfSApO1xuXG5cdE1lc2guY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0dGhpcy50eXBlID0gJ0xpbmVTZWdtZW50czInO1xuXG59O1xuXG5MaW5lU2VnbWVudHMyLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE1lc2gucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogTGluZVNlZ21lbnRzMixcblxuXHRpc0xpbmVTZWdtZW50czI6IHRydWUsXG5cblx0Y29tcHV0ZUxpbmVEaXN0YW5jZXM6ICggZnVuY3Rpb24gKCkgeyAvLyBmb3IgYmFja3dhcmRzLWNvbXBhdGFiaWxpdHksIGJ1dCBjb3VsZCBiZSBhIG1ldGhvZCBvZiBMaW5lU2VnbWVudHNHZW9tZXRyeS4uLlxuXG5cdFx0dmFyIHN0YXJ0ID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgZW5kID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBjb21wdXRlTGluZURpc3RhbmNlcygpIHtcblxuXHRcdFx0dmFyIGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcblxuXHRcdFx0dmFyIGluc3RhbmNlU3RhcnQgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLmluc3RhbmNlU3RhcnQ7XG5cdFx0XHR2YXIgaW5zdGFuY2VFbmQgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLmluc3RhbmNlRW5kO1xuXHRcdFx0dmFyIGxpbmVEaXN0YW5jZXMgPSBuZXcgRmxvYXQzMkFycmF5KCAyICogaW5zdGFuY2VTdGFydC5kYXRhLmNvdW50ICk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgaiA9IDAsIGwgPSBpbnN0YW5jZVN0YXJ0LmRhdGEuY291bnQ7IGkgPCBsOyBpICsrLCBqICs9IDIgKSB7XG5cblx0XHRcdFx0c3RhcnQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggaW5zdGFuY2VTdGFydCwgaSApO1xuXHRcdFx0XHRlbmQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggaW5zdGFuY2VFbmQsIGkgKTtcblxuXHRcdFx0XHRsaW5lRGlzdGFuY2VzWyBqIF0gPSAoIGogPT09IDAgKSA/IDAgOiBsaW5lRGlzdGFuY2VzWyBqIC0gMSBdO1xuXHRcdFx0XHRsaW5lRGlzdGFuY2VzWyBqICsgMSBdID0gbGluZURpc3RhbmNlc1sgaiBdICsgc3RhcnQuZGlzdGFuY2VUbyggZW5kICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIGluc3RhbmNlRGlzdGFuY2VCdWZmZXIgPSBuZXcgSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIoIGxpbmVEaXN0YW5jZXMsIDIsIDEgKTsgLy8gZDAsIGQxXG5cblx0XHRcdGdlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ2luc3RhbmNlRGlzdGFuY2VTdGFydCcsIG5ldyBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSggaW5zdGFuY2VEaXN0YW5jZUJ1ZmZlciwgMSwgMCApICk7IC8vIGQwXG5cdFx0XHRnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdpbnN0YW5jZURpc3RhbmNlRW5kJywgbmV3IEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKCBpbnN0YW5jZURpc3RhbmNlQnVmZmVyLCAxLCAxICkgKTsgLy8gZDFcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSApLFxuXG5cdHJheWNhc3Q6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHN0YXJ0ID0gbmV3IFZlY3RvcjQoKTtcblx0XHR2YXIgZW5kID0gbmV3IFZlY3RvcjQoKTtcblxuXHRcdHZhciBzc09yaWdpbiA9IG5ldyBWZWN0b3I0KCk7XG5cdFx0dmFyIHNzT3JpZ2luMyA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIG12TWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblx0XHR2YXIgbGluZSA9IG5ldyBMaW5lMygpO1xuXHRcdHZhciBjbG9zZXN0UG9pbnQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJheWNhc3QoIHJheWNhc3RlciwgaW50ZXJzZWN0cyApIHtcblxuXHRcdFx0aWYgKCByYXljYXN0ZXIuY2FtZXJhID09PSBudWxsICkge1xuXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdMaW5lU2VnbWVudHMyOiBcIlJheWNhc3Rlci5jYW1lcmFcIiBuZWVkcyB0byBiZSBzZXQgaW4gb3JkZXIgdG8gcmF5Y2FzdCBhZ2FpbnN0IExpbmVTZWdtZW50czIuJyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciB0aHJlc2hvbGQgPSAoIHJheWNhc3Rlci5wYXJhbXMuTGluZTIgIT09IHVuZGVmaW5lZCApID8gcmF5Y2FzdGVyLnBhcmFtcy5MaW5lMi50aHJlc2hvbGQgfHwgMCA6IDA7XG5cblx0XHRcdHZhciByYXkgPSByYXljYXN0ZXIucmF5O1xuXHRcdFx0dmFyIGNhbWVyYSA9IHJheWNhc3Rlci5jYW1lcmE7XG5cdFx0XHR2YXIgcHJvamVjdGlvbk1hdHJpeCA9IGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4O1xuXG5cdFx0XHR2YXIgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xuXHRcdFx0dmFyIG1hdGVyaWFsID0gdGhpcy5tYXRlcmlhbDtcblx0XHRcdHZhciByZXNvbHV0aW9uID0gbWF0ZXJpYWwucmVzb2x1dGlvbjtcblx0XHRcdHZhciBsaW5lV2lkdGggPSBtYXRlcmlhbC5saW5ld2lkdGggKyB0aHJlc2hvbGQ7XG5cblx0XHRcdHZhciBpbnN0YW5jZVN0YXJ0ID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5pbnN0YW5jZVN0YXJ0O1xuXHRcdFx0dmFyIGluc3RhbmNlRW5kID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5pbnN0YW5jZUVuZDtcblxuXHRcdFx0Ly8gcGljayBhIHBvaW50IDEgdW5pdCBvdXQgYWxvbmcgdGhlIHJheSB0byBhdm9pZCB0aGUgcmF5IG9yaWdpblxuXHRcdFx0Ly8gc2l0dGluZyBhdCB0aGUgY2FtZXJhIG9yaWdpbiB3aGljaCB3aWxsIGNhdXNlIFwid1wiIHRvIGJlIDAgd2hlblxuXHRcdFx0Ly8gYXBwbHlpbmcgdGhlIHByb2plY3Rpb24gbWF0cml4LlxuXHRcdFx0cmF5LmF0KCAxLCBzc09yaWdpbiApO1xuXG5cdFx0XHQvLyBuZGMgc3BhY2UgWyAtIDEuMCwgMS4wIF1cblx0XHRcdHNzT3JpZ2luLncgPSAxO1xuXHRcdFx0c3NPcmlnaW4uYXBwbHlNYXRyaXg0KCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICk7XG5cdFx0XHRzc09yaWdpbi5hcHBseU1hdHJpeDQoIHByb2plY3Rpb25NYXRyaXggKTtcblx0XHRcdHNzT3JpZ2luLm11bHRpcGx5U2NhbGFyKCAxIC8gc3NPcmlnaW4udyApO1xuXG5cdFx0XHQvLyBzY3JlZW4gc3BhY2Vcblx0XHRcdHNzT3JpZ2luLnggKj0gcmVzb2x1dGlvbi54IC8gMjtcblx0XHRcdHNzT3JpZ2luLnkgKj0gcmVzb2x1dGlvbi55IC8gMjtcblx0XHRcdHNzT3JpZ2luLnogPSAwO1xuXG5cdFx0XHRzc09yaWdpbjMuY29weSggc3NPcmlnaW4gKTtcblxuXHRcdFx0dmFyIG1hdHJpeFdvcmxkID0gdGhpcy5tYXRyaXhXb3JsZDtcblx0XHRcdG12TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UsIG1hdHJpeFdvcmxkICk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGluc3RhbmNlU3RhcnQuY291bnQ7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHN0YXJ0LmZyb21CdWZmZXJBdHRyaWJ1dGUoIGluc3RhbmNlU3RhcnQsIGkgKTtcblx0XHRcdFx0ZW5kLmZyb21CdWZmZXJBdHRyaWJ1dGUoIGluc3RhbmNlRW5kLCBpICk7XG5cblx0XHRcdFx0c3RhcnQudyA9IDE7XG5cdFx0XHRcdGVuZC53ID0gMTtcblxuXHRcdFx0XHQvLyBjYW1lcmEgc3BhY2Vcblx0XHRcdFx0c3RhcnQuYXBwbHlNYXRyaXg0KCBtdk1hdHJpeCApO1xuXHRcdFx0XHRlbmQuYXBwbHlNYXRyaXg0KCBtdk1hdHJpeCApO1xuXG5cdFx0XHRcdC8vIGNsaXAgc3BhY2Vcblx0XHRcdFx0c3RhcnQuYXBwbHlNYXRyaXg0KCBwcm9qZWN0aW9uTWF0cml4ICk7XG5cdFx0XHRcdGVuZC5hcHBseU1hdHJpeDQoIHByb2plY3Rpb25NYXRyaXggKTtcblxuXHRcdFx0XHQvLyBuZGMgc3BhY2UgWyAtIDEuMCwgMS4wIF1cblx0XHRcdFx0c3RhcnQubXVsdGlwbHlTY2FsYXIoIDEgLyBzdGFydC53ICk7XG5cdFx0XHRcdGVuZC5tdWx0aXBseVNjYWxhciggMSAvIGVuZC53ICk7XG5cblx0XHRcdFx0Ly8gc2tpcCB0aGUgc2VnbWVudCBpZiBpdCdzIG91dHNpZGUgdGhlIGNhbWVyYSBuZWFyIGFuZCBmYXIgcGxhbmVzXG5cdFx0XHRcdHZhciBpc0JlaGluZENhbWVyYU5lYXIgPSBzdGFydC56IDwgLSAxICYmIGVuZC56IDwgLSAxO1xuXHRcdFx0XHR2YXIgaXNQYXN0Q2FtZXJhRmFyID0gc3RhcnQueiA+IDEgJiYgZW5kLnogPiAxO1xuXHRcdFx0XHRpZiAoIGlzQmVoaW5kQ2FtZXJhTmVhciB8fCBpc1Bhc3RDYW1lcmFGYXIgKSB7XG5cblx0XHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gc2NyZWVuIHNwYWNlXG5cdFx0XHRcdHN0YXJ0LnggKj0gcmVzb2x1dGlvbi54IC8gMjtcblx0XHRcdFx0c3RhcnQueSAqPSByZXNvbHV0aW9uLnkgLyAyO1xuXG5cdFx0XHRcdGVuZC54ICo9IHJlc29sdXRpb24ueCAvIDI7XG5cdFx0XHRcdGVuZC55ICo9IHJlc29sdXRpb24ueSAvIDI7XG5cblx0XHRcdFx0Ly8gY3JlYXRlIDJkIHNlZ21lbnRcblx0XHRcdFx0bGluZS5zdGFydC5jb3B5KCBzdGFydCApO1xuXHRcdFx0XHRsaW5lLnN0YXJ0LnogPSAwO1xuXG5cdFx0XHRcdGxpbmUuZW5kLmNvcHkoIGVuZCApO1xuXHRcdFx0XHRsaW5lLmVuZC56ID0gMDtcblxuXHRcdFx0XHQvLyBnZXQgY2xvc2VzdCBwb2ludCBvbiByYXkgdG8gc2VnbWVudFxuXHRcdFx0XHR2YXIgcGFyYW0gPSBsaW5lLmNsb3Nlc3RQb2ludFRvUG9pbnRQYXJhbWV0ZXIoIHNzT3JpZ2luMywgdHJ1ZSApO1xuXHRcdFx0XHRsaW5lLmF0KCBwYXJhbSwgY2xvc2VzdFBvaW50ICk7XG5cblx0XHRcdFx0Ly8gY2hlY2sgaWYgdGhlIGludGVyc2VjdGlvbiBwb2ludCBpcyB3aXRoaW4gY2xpcCBzcGFjZVxuXHRcdFx0XHR2YXIgelBvcyA9IE1hdGhVdGlscy5sZXJwKCBzdGFydC56LCBlbmQueiwgcGFyYW0gKTtcblx0XHRcdFx0dmFyIGlzSW5DbGlwU3BhY2UgPSB6UG9zID49IC0gMSAmJiB6UG9zIDw9IDE7XG5cblx0XHRcdFx0dmFyIGlzSW5zaWRlID0gc3NPcmlnaW4zLmRpc3RhbmNlVG8oIGNsb3Nlc3RQb2ludCApIDwgbGluZVdpZHRoICogMC41O1xuXG5cdFx0XHRcdGlmICggaXNJbkNsaXBTcGFjZSAmJiBpc0luc2lkZSApIHtcblxuXHRcdFx0XHRcdGxpbmUuc3RhcnQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggaW5zdGFuY2VTdGFydCwgaSApO1xuXHRcdFx0XHRcdGxpbmUuZW5kLmZyb21CdWZmZXJBdHRyaWJ1dGUoIGluc3RhbmNlRW5kLCBpICk7XG5cblx0XHRcdFx0XHRsaW5lLnN0YXJ0LmFwcGx5TWF0cml4NCggbWF0cml4V29ybGQgKTtcblx0XHRcdFx0XHRsaW5lLmVuZC5hcHBseU1hdHJpeDQoIG1hdHJpeFdvcmxkICk7XG5cblx0XHRcdFx0XHR2YXIgcG9pbnRPbkxpbmUgPSBuZXcgVmVjdG9yMygpO1xuXHRcdFx0XHRcdHZhciBwb2ludCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdFx0XHRyYXkuZGlzdGFuY2VTcVRvU2VnbWVudCggbGluZS5zdGFydCwgbGluZS5lbmQsIHBvaW50LCBwb2ludE9uTGluZSApO1xuXG5cdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCB7XG5cblx0XHRcdFx0XHRcdHBvaW50OiBwb2ludCxcblx0XHRcdFx0XHRcdHBvaW50T25MaW5lOiBwb2ludE9uTGluZSxcblx0XHRcdFx0XHRcdGRpc3RhbmNlOiByYXkub3JpZ2luLmRpc3RhbmNlVG8oIHBvaW50ICksXG5cblx0XHRcdFx0XHRcdG9iamVjdDogdGhpcyxcblx0XHRcdFx0XHRcdGZhY2U6IG51bGwsXG5cdFx0XHRcdFx0XHRmYWNlSW5kZXg6IGksXG5cdFx0XHRcdFx0XHR1djogbnVsbCxcblx0XHRcdFx0XHRcdHV2MjogbnVsbCxcblxuXHRcdFx0XHRcdH0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fSgpIClcblxufSApO1xuXG5leHBvcnQgeyBMaW5lU2VnbWVudHMyIH07XG4iLCJcbmltcG9ydCB7IExpbmVTZWdtZW50czIgfSBmcm9tIFwiLi9MaW5lU2VnbWVudHMyXCI7XG5pbXBvcnQgeyBMaW5lR2VvbWV0cnkgfSBmcm9tIFwiLi9MaW5lR2VvbWV0cnlcIjtcbmltcG9ydCB7IExpbmVNYXRlcmlhbCB9IGZyb20gXCIuL0xpbmVNYXRlcmlhbFwiO1xuXG52YXIgTGluZTIgPSBmdW5jdGlvbiAoIGdlb21ldHJ5LCBtYXRlcmlhbCApIHtcblxuXHRpZiAoIGdlb21ldHJ5ID09PSB1bmRlZmluZWQgKSBnZW9tZXRyeSA9IG5ldyBMaW5lR2VvbWV0cnkoKTtcblx0aWYgKCBtYXRlcmlhbCA9PT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwgPSBuZXcgTGluZU1hdGVyaWFsKCB7IGNvbG9yOiBNYXRoLnJhbmRvbSgpICogMHhmZmZmZmYgfSApO1xuXG5cdExpbmVTZWdtZW50czIuY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0dGhpcy50eXBlID0gJ0xpbmUyJztcblxufTtcblxuTGluZTIucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTGluZVNlZ21lbnRzMi5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBMaW5lMixcblxuXHRpc0xpbmUyOiB0cnVlXG5cbn0gKTtcblxuZXhwb3J0IHsgTGluZTIgfTtcbiIsIi8qXHJcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJsdWVNYXAsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSAoTUlUKS5cclxuICpcclxuICogQ29weXJpZ2h0IChjKSBCbHVlIChMdWthcyBSaWVnZXIpIDxodHRwczovL2JsdWVjb2xvcmVkLmRlPlxyXG4gKiBDb3B5cmlnaHQgKGMpIGNvbnRyaWJ1dG9yc1xyXG4gKlxyXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XHJcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICdTb2Z0d2FyZScpLCB0byBkZWFsXHJcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcclxuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxyXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcclxuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcclxuICpcclxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cclxuICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXHJcbiAqXHJcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAnQVMgSVMnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXHJcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxyXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcclxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxyXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxyXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXHJcbiAqIFRIRSBTT0ZUV0FSRS5cclxuICovXHJcbmltcG9ydCB7IFNoYWRlckNodW5rIH0gZnJvbSAndGhyZWUnO1xyXG5cclxuZXhwb3J0IGNvbnN0IE1BUktFUl9GSUxMX0ZSQUdNRU5UX1NIQURFUiA9IGBcclxuJHtTaGFkZXJDaHVuay5sb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50fVxyXG5cclxudmFyeWluZyB2ZWMzIHZQb3NpdGlvbjtcclxudmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xyXG52YXJ5aW5nIHZlYzMgdk5vcm1hbDtcclxudmFyeWluZyB2ZWMyIHZVdjtcclxudmFyeWluZyB2ZWMzIHZDb2xvcjtcclxuXHJcbnVuaWZvcm0gdmVjNCBtYXJrZXJDb2xvcjtcclxuXHJcbnZvaWQgbWFpbigpIHtcclxuXHR2ZWM0IGNvbG9yID0gbWFya2VyQ29sb3I7XHJcblx0XHJcblx0Ly9hcHBseSB2ZXJ0ZXgtY29sb3JcclxuXHRjb2xvci5yZ2IgKj0gdkNvbG9yLnJnYjtcclxuXHRcclxuXHRnbF9GcmFnQ29sb3IgPSBjb2xvcjtcclxuXHRcclxuXHQke1NoYWRlckNodW5rLmxvZ2RlcHRoYnVmX2ZyYWdtZW50fVxyXG59XHJcbmA7XHJcbiIsIi8qXHJcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJsdWVNYXAsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSAoTUlUKS5cclxuICpcclxuICogQ29weXJpZ2h0IChjKSBCbHVlIChMdWthcyBSaWVnZXIpIDxodHRwczovL2JsdWVjb2xvcmVkLmRlPlxyXG4gKiBDb3B5cmlnaHQgKGMpIGNvbnRyaWJ1dG9yc1xyXG4gKlxyXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XHJcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICdTb2Z0d2FyZScpLCB0byBkZWFsXHJcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcclxuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxyXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcclxuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcclxuICpcclxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cclxuICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXHJcbiAqXHJcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAnQVMgSVMnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXHJcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxyXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcclxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxyXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxyXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXHJcbiAqIFRIRSBTT0ZUV0FSRS5cclxuICovXHJcbmltcG9ydCB7IFNoYWRlckNodW5rIH0gZnJvbSAndGhyZWUnO1xyXG5cclxuZXhwb3J0IGNvbnN0IE1BUktFUl9GSUxMX1ZFUlRFWF9TSEFERVIgPSBgXHJcbiNpbmNsdWRlIDxjb21tb24+XHJcbiR7U2hhZGVyQ2h1bmsubG9nZGVwdGhidWZfcGFyc192ZXJ0ZXh9XHJcblxyXG52YXJ5aW5nIHZlYzMgdlBvc2l0aW9uO1xyXG52YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XHJcbnZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xyXG52YXJ5aW5nIHZlYzIgdlV2O1xyXG52YXJ5aW5nIHZlYzMgdkNvbG9yO1xyXG5cclxudm9pZCBtYWluKCkge1xyXG5cdHZQb3NpdGlvbiA9IHBvc2l0aW9uO1xyXG5cdHZXb3JsZFBvc2l0aW9uID0gKG1vZGVsTWF0cml4ICogdmVjNChwb3NpdGlvbiwgMSkpLnh5ejtcclxuXHR2Tm9ybWFsID0gbm9ybWFsO1xyXG5cdHZVdiA9IHV2O1xyXG5cdHZDb2xvciA9IHZlYzMoMS4wKTtcclxuXHRcclxuXHRnbF9Qb3NpdGlvbiA9IFxyXG5cdFx0cHJvamVjdGlvbk1hdHJpeCAqXHJcblx0XHR2aWV3TWF0cml4ICpcclxuXHRcdG1vZGVsTWF0cml4ICpcclxuXHRcdHZlYzQocG9zaXRpb24sIDEpO1xyXG5cdFxyXG5cdCR7U2hhZGVyQ2h1bmsubG9nZGVwdGhidWZfdmVydGV4fSBcclxufVxyXG5gO1xyXG4iLCJpbXBvcnQge01hcmtlcn0gZnJvbSBcIi4vTWFya2VyXCI7XHJcbmltcG9ydCB7XHJcbiAgICBDb2xvcixcclxuICAgIERvdWJsZVNpZGUsXHJcbiAgICBNZXNoLFxyXG4gICAgT2JqZWN0M0QsIFNoYWRlck1hdGVyaWFsLFxyXG4gICAgU2hhcGUsXHJcbiAgICBTaGFwZUJ1ZmZlckdlb21ldHJ5LFxyXG4gICAgVmVjdG9yMlxyXG59IGZyb20gXCJ0aHJlZVwiO1xyXG5pbXBvcnQge0xpbmVNYXRlcmlhbH0gZnJvbSBcIi4uL3V0aWwvbGluZXMvTGluZU1hdGVyaWFsXCI7XHJcbmltcG9ydCB7TGluZUdlb21ldHJ5fSBmcm9tIFwiLi4vdXRpbC9saW5lcy9MaW5lR2VvbWV0cnlcIjtcclxuaW1wb3J0IHtMaW5lMn0gZnJvbSBcIi4uL3V0aWwvbGluZXMvTGluZTJcIjtcclxuaW1wb3J0IHtNQVJLRVJfRklMTF9GUkFHTUVOVF9TSEFERVJ9IGZyb20gXCIuL3NoYWRlci9NYXJrZXJGaWxsRnJhZ21lbnRTaGFkZXJcIjtcclxuaW1wb3J0IHtNQVJLRVJfRklMTF9WRVJURVhfU0hBREVSfSBmcm9tIFwiLi9zaGFkZXIvTWFya2VyRmlsbFZlcnRleFNoYWRlclwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNoYXBlTWFya2VyIGV4dGVuZHMgTWFya2VyIHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihtYXJrZXJTZXQsIGlkLCBwYXJlbnRPYmplY3QpIHtcclxuICAgICAgICBzdXBlcihtYXJrZXJTZXQsIGlkKTtcclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2lzU2hhcGVNYXJrZXInLCB7dmFsdWU6IHRydWV9KTtcclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3R5cGUnLCB7dmFsdWU6IFwic2hhcGVcIn0pO1xyXG5cclxuICAgICAgICBsZXQgZmlsbENvbG9yID0gTWFya2VyLm5vcm1hbGl6ZUNvbG9yKHt9KTtcclxuICAgICAgICBsZXQgYm9yZGVyQ29sb3IgPSBNYXJrZXIubm9ybWFsaXplQ29sb3Ioe30pO1xyXG4gICAgICAgIGxldCBsaW5lV2lkdGggPSAyO1xyXG4gICAgICAgIGxldCBkZXB0aFRlc3QgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy5fbGluZU9wYWNpdHkgPSAxO1xyXG4gICAgICAgIHRoaXMuX2ZpbGxPcGFjaXR5ID0gMTtcclxuXHJcbiAgICAgICAgdGhpcy5fbWFya2VyT2JqZWN0ID0gbmV3IE9iamVjdDNEKCk7XHJcbiAgICAgICAgdGhpcy5fbWFya2VyT2JqZWN0LnBvc2l0aW9uLmNvcHkodGhpcy5wb3NpdGlvbik7XHJcbiAgICAgICAgcGFyZW50T2JqZWN0LmFkZCh0aGlzLl9tYXJrZXJPYmplY3QpO1xyXG5cclxuICAgICAgICB0aGlzLl9tYXJrZXJGaWxsTWF0ZXJpYWwgPSBuZXcgU2hhZGVyTWF0ZXJpYWwoe1xyXG4gICAgICAgICAgICB2ZXJ0ZXhTaGFkZXI6IE1BUktFUl9GSUxMX1ZFUlRFWF9TSEFERVIsXHJcbiAgICAgICAgICAgIGZyYWdtZW50U2hhZGVyOiBNQVJLRVJfRklMTF9GUkFHTUVOVF9TSEFERVIsXHJcbiAgICAgICAgICAgIHNpZGU6IERvdWJsZVNpZGUsXHJcbiAgICAgICAgICAgIGRlcHRoVGVzdDogZGVwdGhUZXN0LFxyXG4gICAgICAgICAgICB0cmFuc3BhcmVudDogdHJ1ZSxcclxuICAgICAgICAgICAgdW5pZm9ybXM6IHtcclxuICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiB7IHZhbHVlOiBmaWxsQ29sb3IudmVjNCB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5fbWFya2VyTGluZU1hdGVyaWFsID0gbmV3IExpbmVNYXRlcmlhbCh7XHJcbiAgICAgICAgICAgIGNvbG9yOiBuZXcgQ29sb3IoYm9yZGVyQ29sb3IucmdiKSxcclxuICAgICAgICAgICAgb3BhY2l0eTogYm9yZGVyQ29sb3IuYSxcclxuICAgICAgICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsXHJcbiAgICAgICAgICAgIGxpbmV3aWR0aDogbGluZVdpZHRoLFxyXG4gICAgICAgICAgICBkZXB0aFRlc3Q6IGRlcHRoVGVzdCxcclxuICAgICAgICAgICAgdmVydGV4Q29sb3JzOiBmYWxzZSxcclxuICAgICAgICAgICAgZGFzaGVkOiBmYWxzZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuX21hcmtlckxpbmVNYXRlcmlhbC5yZXNvbHV0aW9uLnNldCh3aW5kb3cuaW5uZXJXaWR0aCwgd2luZG93LmlubmVySGVpZ2h0KTtcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGUobWFya2VyRGF0YSkge1xyXG4gICAgICAgIHN1cGVyLnVwZGF0ZShtYXJrZXJEYXRhKTtcclxuICAgICAgICB0aGlzLmhlaWdodCA9IG1hcmtlckRhdGEuaGVpZ2h0ID8gcGFyc2VGbG9hdChtYXJrZXJEYXRhLmhlaWdodCkgOiAwLjA7XHJcbiAgICAgICAgdGhpcy5kZXB0aFRlc3QgPSAhIW1hcmtlckRhdGEuZGVwdGhUZXN0O1xyXG5cclxuICAgICAgICBpZiAobWFya2VyRGF0YS5maWxsQ29sb3IpIHRoaXMuZmlsbENvbG9yID0gbWFya2VyRGF0YS5maWxsQ29sb3I7XHJcbiAgICAgICAgaWYgKG1hcmtlckRhdGEuYm9yZGVyQ29sb3IpIHRoaXMuYm9yZGVyQ29sb3IgPSBtYXJrZXJEYXRhLmJvcmRlckNvbG9yO1xyXG5cclxuICAgICAgICB0aGlzLmxpbmVXaWR0aCA9IG1hcmtlckRhdGEubGluZVdpZHRoID8gcGFyc2VGbG9hdChtYXJrZXJEYXRhLmxpbmVXaWR0aCkgOiAyO1xyXG5cclxuICAgICAgICBsZXQgcG9pbnRzID0gW107XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobWFya2VyRGF0YS5zaGFwZSkpIHtcclxuICAgICAgICAgICAgbWFya2VyRGF0YS5zaGFwZS5mb3JFYWNoKHBvaW50ID0+IHtcclxuICAgICAgICAgICAgICAgIHBvaW50cy5wdXNoKG5ldyBWZWN0b3IyKHBhcnNlRmxvYXQocG9pbnQueCksIHBhcnNlRmxvYXQocG9pbnQueikpKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2hhcGUgPSBwb2ludHM7XHJcbiAgICB9XHJcblxyXG4gICAgX29uQmVmb3JlUmVuZGVyKHJlbmRlcmVyLCBzY2VuZSwgY2FtZXJhKSB7XHJcbiAgICAgICAgc3VwZXIuX29uQmVmb3JlUmVuZGVyKHJlbmRlcmVyLCBzY2VuZSwgY2FtZXJhKTtcclxuXHJcbiAgICAgICAgdGhpcy5fbWFya2VyRmlsbE1hdGVyaWFsLnVuaWZvcm1zLm1hcmtlckNvbG9yLnZhbHVlLncgPSB0aGlzLl9maWxsT3BhY2l0eSAqIHRoaXMuX29wYWNpdHk7XHJcbiAgICAgICAgdGhpcy5fbWFya2VyTGluZU1hdGVyaWFsLm9wYWNpdHkgPSB0aGlzLl9saW5lT3BhY2l0eSAqIHRoaXMuX29wYWNpdHk7XHJcbiAgICB9XHJcblxyXG4gICAgZGlzcG9zZSgpIHtcclxuICAgICAgICB0aGlzLl9tYXJrZXJPYmplY3QucGFyZW50LnJlbW92ZSh0aGlzLl9tYXJrZXJPYmplY3QpO1xyXG4gICAgICAgIHRoaXMuX21hcmtlck9iamVjdC5jaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcclxuICAgICAgICAgICAgaWYgKGNoaWxkLmdlb21ldHJ5ICYmIGNoaWxkLmdlb21ldHJ5LmlzR2VvbWV0cnkpIGNoaWxkLmdlb21ldHJ5LmRpc3Bvc2UoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLl9tYXJrZXJPYmplY3QuY2xlYXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5fbWFya2VyRmlsbE1hdGVyaWFsLmRpc3Bvc2UoKTtcclxuICAgICAgICB0aGlzLl9tYXJrZXJMaW5lTWF0ZXJpYWwuZGlzcG9zZSgpO1xyXG5cclxuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBmaWxsLWNvbG9yXHJcbiAgICAgKlxyXG4gICAgICogY29sb3Itb2JqZWN0IGZvcm1hdDpcclxuICAgICAqIDxjb2RlPjxwcmU+XHJcbiAgICAgKiB7XHJcbiAgICAgKiAgICAgcjogMCwgICAgLy8gaW50IDAtMjU1IHJlZFxyXG4gICAgICogICAgIGc6IDAsICAgIC8vIGludCAwLTI1NSBncmVlblxyXG4gICAgICogICAgIGI6IDAsICAgIC8vIGludCAwLTI1NSBibHVlXHJcbiAgICAgKiAgICAgYTogMCAgICAgLy8gZmxvYXQgMC0xIGFscGhhXHJcbiAgICAgKiB9XHJcbiAgICAgKiA8L3ByZT48L2NvZGU+XHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGNvbG9yIHtPYmplY3R9XHJcbiAgICAgKi9cclxuICAgIHNldCBmaWxsQ29sb3IoY29sb3IpIHtcclxuICAgICAgICBjb2xvciA9IE1hcmtlci5ub3JtYWxpemVDb2xvcihjb2xvcik7XHJcblxyXG4gICAgICAgIHRoaXMuX21hcmtlckZpbGxNYXRlcmlhbC51bmlmb3Jtcy5tYXJrZXJDb2xvci52YWx1ZSA9IGNvbG9yLnZlYzQ7XHJcbiAgICAgICAgdGhpcy5fZmlsbE9wYWNpdHkgPSBjb2xvci5hO1xyXG4gICAgICAgIHRoaXMuX21hcmtlckZpbGxNYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBib3JkZXItY29sb3JcclxuICAgICAqXHJcbiAgICAgKiBjb2xvci1vYmplY3QgZm9ybWF0OlxyXG4gICAgICogPGNvZGU+PHByZT5cclxuICAgICAqIHtcclxuICAgICAqICAgICByOiAwLCAgICAvLyBpbnQgMC0yNTUgcmVkXHJcbiAgICAgKiAgICAgZzogMCwgICAgLy8gaW50IDAtMjU1IGdyZWVuXHJcbiAgICAgKiAgICAgYjogMCwgICAgLy8gaW50IDAtMjU1IGJsdWVcclxuICAgICAqICAgICBhOiAwICAgICAvLyBmbG9hdCAwLTEgYWxwaGFcclxuICAgICAqIH1cclxuICAgICAqIDwvcHJlPjwvY29kZT5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gY29sb3Ige09iamVjdH1cclxuICAgICAqL1xyXG4gICAgc2V0IGJvcmRlckNvbG9yKGNvbG9yKSB7XHJcbiAgICAgICAgY29sb3IgPSBNYXJrZXIubm9ybWFsaXplQ29sb3IoY29sb3IpO1xyXG5cclxuICAgICAgICB0aGlzLl9tYXJrZXJMaW5lTWF0ZXJpYWwuY29sb3Iuc2V0SGV4KGNvbG9yLnJnYik7XHJcbiAgICAgICAgdGhpcy5fbGluZU9wYWNpdHkgPSBjb2xvci5hO1xyXG4gICAgICAgIHRoaXMuX21hcmtlckxpbmVNYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSB3aWR0aCBvZiB0aGUgbWFya2VyLWxpbmVcclxuICAgICAqIEBwYXJhbSB3aWR0aCB7bnVtYmVyfVxyXG4gICAgICovXHJcbiAgICBzZXQgbGluZVdpZHRoKHdpZHRoKSB7XHJcbiAgICAgICAgdGhpcy5fbWFya2VyTGluZU1hdGVyaWFsLmxpbmV3aWR0aCA9IHdpZHRoO1xyXG4gICAgICAgIHRoaXMuX21hcmtlckxpbmVNYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIGlmIHRoaXMgbWFya2VyIGNhbiBiZSBzZWVuIHRocm91Z2ggdGVycmFpblxyXG4gICAgICogQHBhcmFtIHRlc3Qge2Jvb2xlYW59XHJcbiAgICAgKi9cclxuICAgIHNldCBkZXB0aFRlc3QodGVzdCkge1xyXG4gICAgICAgIHRoaXMuX21hcmtlckZpbGxNYXRlcmlhbC5kZXB0aFRlc3QgPSB0ZXN0O1xyXG4gICAgICAgIHRoaXMuX21hcmtlckZpbGxNYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuX21hcmtlckxpbmVNYXRlcmlhbC5kZXB0aFRlc3QgPSB0ZXN0O1xyXG4gICAgICAgIHRoaXMuX21hcmtlckxpbmVNYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGRlcHRoVGVzdCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbWFya2VyRmlsbE1hdGVyaWFsLmRlcHRoVGVzdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGhlaWdodCBvZiB0aGlzIG1hcmtlclxyXG4gICAgICogQHBhcmFtIGhlaWdodCB7bnVtYmVyfVxyXG4gICAgICovXHJcbiAgICBzZXQgaGVpZ2h0KGhlaWdodCkge1xyXG4gICAgICAgIHRoaXMuX21hcmtlck9iamVjdC5wb3NpdGlvbi55ID0gaGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgcG9pbnRzIGZvciB0aGUgc2hhcGUgb2YgdGhpcyBtYXJrZXIuXHJcbiAgICAgKiBAcGFyYW0gcG9pbnRzIHtWZWN0b3IyW119XHJcbiAgICAgKi9cclxuICAgIHNldCBzaGFwZShwb2ludHMpIHtcclxuICAgICAgICAvLyByZW1vdmUgb2xkIG1hcmtlclxyXG4gICAgICAgIHRoaXMuX21hcmtlck9iamVjdC5jaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcclxuICAgICAgICAgICAgaWYgKGNoaWxkLmdlb21ldHJ5ICYmIGNoaWxkLmdlb21ldHJ5LmlzR2VvbWV0cnkpIGNoaWxkLmdlb21ldHJ5LmRpc3Bvc2UoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLl9tYXJrZXJPYmplY3QuY2xlYXIoKTtcclxuXHJcbiAgICAgICAgaWYgKHBvaW50cy5sZW5ndGggPCAzKSByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMuX21hcmtlck9iamVjdC5wb3NpdGlvbi54ID0gdGhpcy5wb3NpdGlvbi54O1xyXG4gICAgICAgIHRoaXMuX21hcmtlck9iamVjdC5wb3NpdGlvbi56ID0gdGhpcy5wb3NpdGlvbi56O1xyXG5cclxuICAgICAgICAvLyBib3JkZXItbGluZVxyXG4gICAgICAgIGxldCBwb2ludHMzZCA9IFtdO1xyXG4gICAgICAgIHBvaW50cy5mb3JFYWNoKHBvaW50ID0+IHBvaW50czNkLnB1c2gocG9pbnQueCwgMCwgcG9pbnQueSkpO1xyXG4gICAgICAgIHBvaW50czNkLnB1c2gocG9pbnRzWzBdLngsIDAsIHBvaW50c1swXS55KVxyXG4gICAgICAgIGxldCBsaW5lR2VvID0gbmV3IExpbmVHZW9tZXRyeSgpXHJcbiAgICAgICAgbGluZUdlby5zZXRQb3NpdGlvbnMocG9pbnRzM2QpO1xyXG4gICAgICAgIGxpbmVHZW8udHJhbnNsYXRlKC10aGlzLnBvc2l0aW9uLngsIDAuMDE0NTYsIC10aGlzLnBvc2l0aW9uLnopO1xyXG4gICAgICAgIGxldCBsaW5lID0gbmV3IExpbmUyKGxpbmVHZW8sIHRoaXMuX21hcmtlckxpbmVNYXRlcmlhbCk7XHJcbiAgICAgICAgbGluZS5vbkJlZm9yZVJlbmRlciA9IHJlbmRlcmVyID0+IHJlbmRlcmVyLmdldFNpemUobGluZS5tYXRlcmlhbC5yZXNvbHV0aW9uKTtcclxuICAgICAgICBsaW5lLmNvbXB1dGVMaW5lRGlzdGFuY2VzKCk7XHJcbiAgICAgICAgbGluZS5tYXJrZXIgPSB0aGlzO1xyXG4gICAgICAgIHRoaXMuX21hcmtlck9iamVjdC5hZGQobGluZSk7XHJcblxyXG4gICAgICAgIC8vIGZpbGxcclxuICAgICAgICBpZiAodGhpcy5fbWFya2VyRmlsbE1hdGVyaWFsLnVuaWZvcm1zLm1hcmtlckNvbG9yLnZhbHVlLncgPiAwKSB7XHJcbiAgICAgICAgICAgIGxldCBzaGFwZSA9IG5ldyBTaGFwZShwb2ludHMpO1xyXG4gICAgICAgICAgICBsZXQgZmlsbEdlbyA9IG5ldyBTaGFwZUJ1ZmZlckdlb21ldHJ5KHNoYXBlLCAxKTtcclxuICAgICAgICAgICAgZmlsbEdlby5yb3RhdGVYKE1hdGguUEkgLyAyKTsgLy9tYWtlIHkgdG8gelxyXG4gICAgICAgICAgICBmaWxsR2VvLnRyYW5zbGF0ZSgtdGhpcy5wb3NpdGlvbi54LCAwLjAxNDU2LCAtdGhpcy5wb3NpdGlvbi56KTtcclxuICAgICAgICAgICAgbGV0IGZpbGwgPSBuZXcgTWVzaChmaWxsR2VvLCB0aGlzLl9tYXJrZXJGaWxsTWF0ZXJpYWwpO1xyXG4gICAgICAgICAgICBmaWxsLm1hcmtlciA9IHRoaXM7XHJcbiAgICAgICAgICAgIHRoaXMuX21hcmtlck9iamVjdC5hZGQoZmlsbCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBwdXQgcmVuZGVyLWhvb2sgb24gZmlyc3Qgb2JqZWN0XHJcbiAgICAgICAgaWYgKHRoaXMuX21hcmtlck9iamVjdC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGxldCBvbGRIb29rID0gdGhpcy5fbWFya2VyT2JqZWN0LmNoaWxkcmVuWzBdLm9uQmVmb3JlUmVuZGVyO1xyXG4gICAgICAgICAgICB0aGlzLl9tYXJrZXJPYmplY3QuY2hpbGRyZW5bMF0ub25CZWZvcmVSZW5kZXIgPSAocmVuZGVyZXIsIHNjZW5lLCBjYW1lcmEsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXApID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX29uQmVmb3JlUmVuZGVyKHJlbmRlcmVyLCBzY2VuZSwgY2FtZXJhKTtcclxuICAgICAgICAgICAgICAgIG9sZEhvb2socmVuZGVyZXIsIHNjZW5lLCBjYW1lcmEsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxufVxyXG4iLCJpbXBvcnQge01hcmtlcn0gZnJvbSBcIi4vTWFya2VyXCI7XHJcbmltcG9ydCB7XHJcbiAgICBDb2xvcixcclxuICAgIE9iamVjdDNELFxyXG4gICAgVmVjdG9yMyxcclxufSBmcm9tIFwidGhyZWVcIjtcclxuaW1wb3J0IHtMaW5lTWF0ZXJpYWx9IGZyb20gXCIuLi91dGlsL2xpbmVzL0xpbmVNYXRlcmlhbFwiO1xyXG5pbXBvcnQge0xpbmVHZW9tZXRyeX0gZnJvbSBcIi4uL3V0aWwvbGluZXMvTGluZUdlb21ldHJ5XCI7XHJcbmltcG9ydCB7TGluZTJ9IGZyb20gXCIuLi91dGlsL2xpbmVzL0xpbmUyXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTGluZU1hcmtlciBleHRlbmRzIE1hcmtlciB7XHJcblxyXG4gICAgY29uc3RydWN0b3IobWFya2VyU2V0LCBpZCwgcGFyZW50T2JqZWN0KSB7XHJcbiAgICAgICAgc3VwZXIobWFya2VyU2V0LCBpZCk7XHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdpc0xpbmVNYXJrZXInLCB7dmFsdWU6IHRydWV9KTtcclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3R5cGUnLCB7dmFsdWU6IFwibGluZVwifSk7XHJcblxyXG4gICAgICAgIGxldCBsaW5lQ29sb3IgPSBNYXJrZXIubm9ybWFsaXplQ29sb3Ioe30pO1xyXG4gICAgICAgIGxldCBsaW5lV2lkdGggPSAyO1xyXG4gICAgICAgIGxldCBkZXB0aFRlc3QgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy5fbGluZU9wYWNpdHkgPSAxO1xyXG5cclxuICAgICAgICB0aGlzLl9tYXJrZXJPYmplY3QgPSBuZXcgT2JqZWN0M0QoKTtcclxuICAgICAgICB0aGlzLl9tYXJrZXJPYmplY3QucG9zaXRpb24uY29weSh0aGlzLnBvc2l0aW9uKTtcclxuICAgICAgICBwYXJlbnRPYmplY3QuYWRkKHRoaXMuX21hcmtlck9iamVjdCk7XHJcblxyXG4gICAgICAgIHRoaXMuX21hcmtlckxpbmVNYXRlcmlhbCA9IG5ldyBMaW5lTWF0ZXJpYWwoe1xyXG4gICAgICAgICAgICBjb2xvcjogbmV3IENvbG9yKGxpbmVDb2xvci5yZ2IpLFxyXG4gICAgICAgICAgICBvcGFjaXR5OiBsaW5lQ29sb3IuYSxcclxuICAgICAgICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsXHJcbiAgICAgICAgICAgIGxpbmV3aWR0aDogbGluZVdpZHRoLFxyXG4gICAgICAgICAgICBkZXB0aFRlc3Q6IGRlcHRoVGVzdCxcclxuICAgICAgICAgICAgdmVydGV4Q29sb3JzOiBmYWxzZSxcclxuICAgICAgICAgICAgZGFzaGVkOiBmYWxzZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuX21hcmtlckxpbmVNYXRlcmlhbC5yZXNvbHV0aW9uLnNldCh3aW5kb3cuaW5uZXJXaWR0aCwgd2luZG93LmlubmVySGVpZ2h0KTtcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGUobWFya2VyRGF0YSkge1xyXG4gICAgICAgIHN1cGVyLnVwZGF0ZShtYXJrZXJEYXRhKTtcclxuXHJcbiAgICAgICAgaWYgKG1hcmtlckRhdGEubGluZUNvbG9yKSB0aGlzLmxpbmVDb2xvciA9IG1hcmtlckRhdGEubGluZUNvbG9yO1xyXG5cclxuICAgICAgICB0aGlzLmxpbmVXaWR0aCA9IG1hcmtlckRhdGEubGluZVdpZHRoID8gcGFyc2VGbG9hdChtYXJrZXJEYXRhLmxpbmVXaWR0aCkgOiAyO1xyXG4gICAgICAgIHRoaXMuZGVwdGhUZXN0ID0gISFtYXJrZXJEYXRhLmRlcHRoVGVzdDtcclxuXHJcbiAgICAgICAgbGV0IHBvaW50cyA9IFtdO1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG1hcmtlckRhdGEubGluZSkpIHtcclxuICAgICAgICAgICAgbWFya2VyRGF0YS5saW5lLmZvckVhY2gocG9pbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgcG9pbnRzLnB1c2gobmV3IFZlY3RvcjMocGFyc2VGbG9hdChwb2ludC54KSwgcGFyc2VGbG9hdChwb2ludC55KSwgcGFyc2VGbG9hdChwb2ludC56KSkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5saW5lID0gcG9pbnRzO1xyXG4gICAgfVxyXG5cclxuICAgIF9vbkJlZm9yZVJlbmRlcihyZW5kZXJlciwgc2NlbmUsIGNhbWVyYSkge1xyXG4gICAgICAgIHN1cGVyLl9vbkJlZm9yZVJlbmRlcihyZW5kZXJlciwgc2NlbmUsIGNhbWVyYSk7XHJcblxyXG4gICAgICAgIHRoaXMuX21hcmtlckxpbmVNYXRlcmlhbC5vcGFjaXR5ID0gdGhpcy5fbGluZU9wYWNpdHkgKiB0aGlzLl9vcGFjaXR5O1xyXG4gICAgfVxyXG5cclxuICAgIGRpc3Bvc2UoKSB7XHJcbiAgICAgICAgdGhpcy5fbWFya2VyT2JqZWN0LnBhcmVudC5yZW1vdmUodGhpcy5fbWFya2VyT2JqZWN0KTtcclxuICAgICAgICB0aGlzLl9tYXJrZXJPYmplY3QuY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjaGlsZC5nZW9tZXRyeSAmJiBjaGlsZC5nZW9tZXRyeS5pc0dlb21ldHJ5KSBjaGlsZC5nZW9tZXRyeS5kaXNwb3NlKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5fbWFya2VyT2JqZWN0LmNsZWFyKCk7XHJcblxyXG4gICAgICAgIHRoaXMuX21hcmtlckxpbmVNYXRlcmlhbC5kaXNwb3NlKCk7XHJcblxyXG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGxpbmUtY29sb3JcclxuICAgICAqXHJcbiAgICAgKiBjb2xvci1vYmplY3QgZm9ybWF0OlxyXG4gICAgICogPGNvZGU+PHByZT5cclxuICAgICAqIHtcclxuICAgICAqICAgICByOiAwLCAgICAvLyBpbnQgMC0yNTUgcmVkXHJcbiAgICAgKiAgICAgZzogMCwgICAgLy8gaW50IDAtMjU1IGdyZWVuXHJcbiAgICAgKiAgICAgYjogMCwgICAgLy8gaW50IDAtMjU1IGJsdWVcclxuICAgICAqICAgICBhOiAwICAgICAvLyBmbG9hdCAwLTEgYWxwaGFcclxuICAgICAqIH1cclxuICAgICAqIDwvcHJlPjwvY29kZT5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gY29sb3Ige09iamVjdH1cclxuICAgICAqL1xyXG4gICAgc2V0IGxpbmVDb2xvcihjb2xvcikge1xyXG4gICAgICAgIGNvbG9yID0gTWFya2VyLm5vcm1hbGl6ZUNvbG9yKGNvbG9yKTtcclxuXHJcbiAgICAgICAgdGhpcy5fbWFya2VyTGluZU1hdGVyaWFsLmNvbG9yLnNldEhleChjb2xvci5yZ2IpO1xyXG4gICAgICAgIHRoaXMuX2xpbmVPcGFjaXR5ID0gY29sb3IuYTtcclxuICAgICAgICB0aGlzLl9tYXJrZXJMaW5lTWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgd2lkdGggb2YgdGhlIG1hcmtlci1saW5lXHJcbiAgICAgKiBAcGFyYW0gd2lkdGgge251bWJlcn1cclxuICAgICAqL1xyXG4gICAgc2V0IGxpbmVXaWR0aCh3aWR0aCkge1xyXG4gICAgICAgIHRoaXMuX21hcmtlckxpbmVNYXRlcmlhbC5saW5ld2lkdGggPSB3aWR0aDtcclxuICAgICAgICB0aGlzLl9tYXJrZXJMaW5lTWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyBpZiB0aGlzIG1hcmtlciBjYW4gYmUgc2VlbiB0aHJvdWdoIHRlcnJhaW5cclxuICAgICAqIEBwYXJhbSB0ZXN0IHtib29sZWFufVxyXG4gICAgICovXHJcbiAgICBzZXQgZGVwdGhUZXN0KHRlc3QpIHtcclxuICAgICAgICB0aGlzLl9tYXJrZXJMaW5lTWF0ZXJpYWwuZGVwdGhUZXN0ID0gdGVzdDtcclxuICAgICAgICB0aGlzLl9tYXJrZXJMaW5lTWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBkZXB0aFRlc3QoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hcmtlckxpbmVNYXRlcmlhbC5kZXB0aFRlc3Q7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBwb2ludHMgZm9yIHRoZSBzaGFwZSBvZiB0aGlzIG1hcmtlci5cclxuICAgICAqIEBwYXJhbSBwb2ludHMge1ZlY3RvcjNbXX1cclxuICAgICAqL1xyXG4gICAgc2V0IGxpbmUocG9pbnRzKSB7XHJcbiAgICAgICAgLy8gcmVtb3ZlIG9sZCBtYXJrZXJcclxuICAgICAgICB0aGlzLl9tYXJrZXJPYmplY3QuY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjaGlsZC5nZW9tZXRyeSAmJiBjaGlsZC5nZW9tZXRyeS5pc0dlb21ldHJ5KSBjaGlsZC5nZW9tZXRyeS5kaXNwb3NlKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5fbWFya2VyT2JqZWN0LmNsZWFyKCk7XHJcblxyXG4gICAgICAgIGlmIChwb2ludHMubGVuZ3RoIDwgMykgcmV0dXJuO1xyXG5cclxuICAgICAgICB0aGlzLl9tYXJrZXJPYmplY3QucG9zaXRpb24uY29weSh0aGlzLnBvc2l0aW9uKTtcclxuXHJcbiAgICAgICAgLy8gbGluZVxyXG4gICAgICAgIGxldCBwb2ludHMzZCA9IFtdO1xyXG4gICAgICAgIHBvaW50cy5mb3JFYWNoKHBvaW50ID0+IHBvaW50czNkLnB1c2gocG9pbnQueCwgcG9pbnQueSwgcG9pbnQueikpO1xyXG4gICAgICAgIGxldCBsaW5lR2VvID0gbmV3IExpbmVHZW9tZXRyeSgpO1xyXG4gICAgICAgIGxpbmVHZW8uc2V0UG9zaXRpb25zKHBvaW50czNkKTtcclxuICAgICAgICBsaW5lR2VvLnRyYW5zbGF0ZSgtdGhpcy5wb3NpdGlvbi54LCAtdGhpcy5wb3NpdGlvbi55LCAtdGhpcy5wb3NpdGlvbi56KTtcclxuICAgICAgICBsZXQgbGluZSA9IG5ldyBMaW5lMihsaW5lR2VvLCB0aGlzLl9tYXJrZXJMaW5lTWF0ZXJpYWwpO1xyXG4gICAgICAgIGxpbmUuY29tcHV0ZUxpbmVEaXN0YW5jZXMoKTtcclxuXHJcbiAgICAgICAgbGluZS5vbkJlZm9yZVJlbmRlciA9IChyZW5kZXJlciwgY2FtZXJhLCBzY2VuZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9vbkJlZm9yZVJlbmRlcihyZW5kZXJlciwgY2FtZXJhLCBzY2VuZSk7XHJcbiAgICAgICAgICAgIHJlbmRlcmVyLmdldFNpemUobGluZS5tYXRlcmlhbC5yZXNvbHV0aW9uKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxpbmUubWFya2VyID0gdGhpcztcclxuICAgICAgICB0aGlzLl9tYXJrZXJPYmplY3QuYWRkKGxpbmUpO1xyXG4gICAgfVxyXG5cclxufSIsImltcG9ydCB7TWFya2VyfSBmcm9tIFwiLi9NYXJrZXJcIjtcclxuaW1wb3J0IHtcclxuICAgIENvbG9yLFxyXG4gICAgRG91YmxlU2lkZSwgRXh0cnVkZUJ1ZmZlckdlb21ldHJ5LFxyXG4gICAgTWVzaCxcclxuICAgIE9iamVjdDNELCBTaGFkZXJNYXRlcmlhbCxcclxuICAgIFNoYXBlLFxyXG4gICAgVmVjdG9yMlxyXG59IGZyb20gXCJ0aHJlZVwiO1xyXG5pbXBvcnQge0xpbmVNYXRlcmlhbH0gZnJvbSBcIi4uL3V0aWwvbGluZXMvTGluZU1hdGVyaWFsXCI7XHJcbmltcG9ydCB7TGluZUdlb21ldHJ5fSBmcm9tIFwiLi4vdXRpbC9saW5lcy9MaW5lR2VvbWV0cnlcIjtcclxuaW1wb3J0IHtMaW5lMn0gZnJvbSBcIi4uL3V0aWwvbGluZXMvTGluZTJcIjtcclxuaW1wb3J0IHtNQVJLRVJfRklMTF9GUkFHTUVOVF9TSEFERVJ9IGZyb20gXCIuL3NoYWRlci9NYXJrZXJGaWxsRnJhZ21lbnRTaGFkZXJcIjtcclxuaW1wb3J0IHtNQVJLRVJfRklMTF9WRVJURVhfU0hBREVSfSBmcm9tIFwiLi9zaGFkZXIvTWFya2VyRmlsbFZlcnRleFNoYWRlclwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEV4dHJ1ZGVNYXJrZXIgZXh0ZW5kcyBNYXJrZXIge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKG1hcmtlclNldCwgaWQsIHBhcmVudE9iamVjdCkge1xyXG4gICAgICAgIHN1cGVyKG1hcmtlclNldCwgaWQpO1xyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnaXNFeHRydWRlTWFya2VyJywge3ZhbHVlOiB0cnVlfSk7XHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICd0eXBlJywge3ZhbHVlOiBcImV4dHJ1ZGVcIn0pO1xyXG5cclxuICAgICAgICBsZXQgZmlsbENvbG9yID0gTWFya2VyLm5vcm1hbGl6ZUNvbG9yKHt9KTtcclxuICAgICAgICBsZXQgYm9yZGVyQ29sb3IgPSBNYXJrZXIubm9ybWFsaXplQ29sb3Ioe30pO1xyXG4gICAgICAgIGxldCBsaW5lV2lkdGggPSAyO1xyXG4gICAgICAgIGxldCBkZXB0aFRlc3QgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy5fbGluZU9wYWNpdHkgPSAxO1xyXG4gICAgICAgIHRoaXMuX2ZpbGxPcGFjaXR5ID0gMTtcclxuXHJcbiAgICAgICAgdGhpcy5fbWFya2VyT2JqZWN0ID0gbmV3IE9iamVjdDNEKCk7XHJcbiAgICAgICAgdGhpcy5fbWFya2VyT2JqZWN0LnBvc2l0aW9uLmNvcHkodGhpcy5wb3NpdGlvbik7XHJcbiAgICAgICAgcGFyZW50T2JqZWN0LmFkZCh0aGlzLl9tYXJrZXJPYmplY3QpO1xyXG5cclxuICAgICAgICB0aGlzLl9tYXJrZXJGaWxsTWF0ZXJpYWwgPSBuZXcgU2hhZGVyTWF0ZXJpYWwoe1xyXG4gICAgICAgICAgICB2ZXJ0ZXhTaGFkZXI6IE1BUktFUl9GSUxMX1ZFUlRFWF9TSEFERVIsXHJcbiAgICAgICAgICAgIGZyYWdtZW50U2hhZGVyOiBNQVJLRVJfRklMTF9GUkFHTUVOVF9TSEFERVIsXHJcbiAgICAgICAgICAgIHNpZGU6IERvdWJsZVNpZGUsXHJcbiAgICAgICAgICAgIGRlcHRoVGVzdDogZGVwdGhUZXN0LFxyXG4gICAgICAgICAgICB0cmFuc3BhcmVudDogdHJ1ZSxcclxuICAgICAgICAgICAgdW5pZm9ybXM6IHtcclxuICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiB7IHZhbHVlOiBmaWxsQ29sb3IudmVjNCB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5fbWFya2VyTGluZU1hdGVyaWFsID0gbmV3IExpbmVNYXRlcmlhbCh7XHJcbiAgICAgICAgICAgIGNvbG9yOiBuZXcgQ29sb3IoYm9yZGVyQ29sb3IucmdiKSxcclxuICAgICAgICAgICAgb3BhY2l0eTogYm9yZGVyQ29sb3IuYSxcclxuICAgICAgICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsXHJcbiAgICAgICAgICAgIGxpbmV3aWR0aDogbGluZVdpZHRoLFxyXG4gICAgICAgICAgICBkZXB0aFRlc3Q6IGRlcHRoVGVzdCxcclxuICAgICAgICAgICAgdmVydGV4Q29sb3JzOiBmYWxzZSxcclxuICAgICAgICAgICAgZGFzaGVkOiBmYWxzZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuX21hcmtlckxpbmVNYXRlcmlhbC5yZXNvbHV0aW9uLnNldCh3aW5kb3cuaW5uZXJXaWR0aCwgd2luZG93LmlubmVySGVpZ2h0KTtcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGUobWFya2VyRGF0YSkge1xyXG4gICAgICAgIHN1cGVyLnVwZGF0ZShtYXJrZXJEYXRhKTtcclxuICAgICAgICB0aGlzLm1pbkhlaWdodCA9IG1hcmtlckRhdGEubWluSGVpZ2h0ID8gcGFyc2VGbG9hdChtYXJrZXJEYXRhLm1pbkhlaWdodCkgOiAwLjA7XHJcbiAgICAgICAgdGhpcy5tYXhIZWlnaHQgPSBtYXJrZXJEYXRhLm1heEhlaWdodCA/IHBhcnNlRmxvYXQobWFya2VyRGF0YS5tYXhIZWlnaHQpIDogMjU1LjA7XHJcbiAgICAgICAgdGhpcy5kZXB0aFRlc3QgPSAhIW1hcmtlckRhdGEuZGVwdGhUZXN0O1xyXG5cclxuICAgICAgICBpZiAobWFya2VyRGF0YS5maWxsQ29sb3IpIHRoaXMuZmlsbENvbG9yID0gbWFya2VyRGF0YS5maWxsQ29sb3I7XHJcbiAgICAgICAgaWYgKG1hcmtlckRhdGEuYm9yZGVyQ29sb3IpIHRoaXMuYm9yZGVyQ29sb3IgPSBtYXJrZXJEYXRhLmJvcmRlckNvbG9yO1xyXG5cclxuICAgICAgICB0aGlzLmxpbmVXaWR0aCA9IG1hcmtlckRhdGEubGluZVdpZHRoID8gcGFyc2VGbG9hdChtYXJrZXJEYXRhLmxpbmVXaWR0aCkgOiAyO1xyXG5cclxuICAgICAgICBsZXQgcG9pbnRzID0gW107XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobWFya2VyRGF0YS5zaGFwZSkpIHtcclxuICAgICAgICAgICAgbWFya2VyRGF0YS5zaGFwZS5mb3JFYWNoKHBvaW50ID0+IHtcclxuICAgICAgICAgICAgICAgIHBvaW50cy5wdXNoKG5ldyBWZWN0b3IyKHBhcnNlRmxvYXQocG9pbnQueCksIHBhcnNlRmxvYXQocG9pbnQueikpKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2hhcGUgPSBwb2ludHM7XHJcbiAgICB9XHJcblxyXG4gICAgX29uQmVmb3JlUmVuZGVyKHJlbmRlcmVyLCBzY2VuZSwgY2FtZXJhKSB7XHJcbiAgICAgICAgc3VwZXIuX29uQmVmb3JlUmVuZGVyKHJlbmRlcmVyLCBzY2VuZSwgY2FtZXJhKTtcclxuXHJcbiAgICAgICAgdGhpcy5fbWFya2VyRmlsbE1hdGVyaWFsLnVuaWZvcm1zLm1hcmtlckNvbG9yLnZhbHVlLncgPSB0aGlzLl9maWxsT3BhY2l0eSAqIHRoaXMuX29wYWNpdHk7XHJcbiAgICAgICAgdGhpcy5fbWFya2VyTGluZU1hdGVyaWFsLm9wYWNpdHkgPSB0aGlzLl9saW5lT3BhY2l0eSAqIHRoaXMuX29wYWNpdHk7XHJcbiAgICB9XHJcblxyXG4gICAgZGlzcG9zZSgpIHtcclxuICAgICAgICB0aGlzLl9tYXJrZXJPYmplY3QucGFyZW50LnJlbW92ZSh0aGlzLl9tYXJrZXJPYmplY3QpO1xyXG4gICAgICAgIHRoaXMuX21hcmtlck9iamVjdC5jaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcclxuICAgICAgICAgICAgaWYgKGNoaWxkLmdlb21ldHJ5ICYmIGNoaWxkLmdlb21ldHJ5LmlzR2VvbWV0cnkpIGNoaWxkLmdlb21ldHJ5LmRpc3Bvc2UoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLl9tYXJrZXJPYmplY3QuY2xlYXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5fbWFya2VyRmlsbE1hdGVyaWFsLmRpc3Bvc2UoKTtcclxuICAgICAgICB0aGlzLl9tYXJrZXJMaW5lTWF0ZXJpYWwuZGlzcG9zZSgpO1xyXG5cclxuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBmaWxsLWNvbG9yXHJcbiAgICAgKlxyXG4gICAgICogY29sb3Itb2JqZWN0IGZvcm1hdDpcclxuICAgICAqIDxjb2RlPjxwcmU+XHJcbiAgICAgKiB7XHJcbiAgICAgKiAgICAgcjogMCwgICAgLy8gaW50IDAtMjU1IHJlZFxyXG4gICAgICogICAgIGc6IDAsICAgIC8vIGludCAwLTI1NSBncmVlblxyXG4gICAgICogICAgIGI6IDAsICAgIC8vIGludCAwLTI1NSBibHVlXHJcbiAgICAgKiAgICAgYTogMCAgICAgLy8gZmxvYXQgMC0xIGFscGhhXHJcbiAgICAgKiB9XHJcbiAgICAgKiA8L3ByZT48L2NvZGU+XHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGNvbG9yIHtPYmplY3R9XHJcbiAgICAgKi9cclxuICAgIHNldCBmaWxsQ29sb3IoY29sb3IpIHtcclxuICAgICAgICBjb2xvciA9IE1hcmtlci5ub3JtYWxpemVDb2xvcihjb2xvcik7XHJcblxyXG4gICAgICAgIHRoaXMuX21hcmtlckZpbGxNYXRlcmlhbC51bmlmb3Jtcy5tYXJrZXJDb2xvci52YWx1ZS5jb3B5KGNvbG9yLnZlYzQpO1xyXG4gICAgICAgIHRoaXMuX2ZpbGxPcGFjaXR5ID0gY29sb3IuYTtcclxuICAgICAgICB0aGlzLl9tYXJrZXJGaWxsTWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgYm9yZGVyLWNvbG9yXHJcbiAgICAgKlxyXG4gICAgICogY29sb3Itb2JqZWN0IGZvcm1hdDpcclxuICAgICAqIDxjb2RlPjxwcmU+XHJcbiAgICAgKiB7XHJcbiAgICAgKiAgICAgcjogMCwgICAgLy8gaW50IDAtMjU1IHJlZFxyXG4gICAgICogICAgIGc6IDAsICAgIC8vIGludCAwLTI1NSBncmVlblxyXG4gICAgICogICAgIGI6IDAsICAgIC8vIGludCAwLTI1NSBibHVlXHJcbiAgICAgKiAgICAgYTogMCAgICAgLy8gZmxvYXQgMC0xIGFscGhhXHJcbiAgICAgKiB9XHJcbiAgICAgKiA8L3ByZT48L2NvZGU+XHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGNvbG9yIHtPYmplY3R9XHJcbiAgICAgKi9cclxuICAgIHNldCBib3JkZXJDb2xvcihjb2xvcikge1xyXG4gICAgICAgIGNvbG9yID0gTWFya2VyLm5vcm1hbGl6ZUNvbG9yKGNvbG9yKTtcclxuXHJcbiAgICAgICAgdGhpcy5fbWFya2VyTGluZU1hdGVyaWFsLmNvbG9yLnNldEhleChjb2xvci5yZ2IpO1xyXG4gICAgICAgIHRoaXMuX2xpbmVPcGFjaXR5ID0gY29sb3IuYTtcclxuICAgICAgICB0aGlzLl9tYXJrZXJMaW5lTWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgd2lkdGggb2YgdGhlIG1hcmtlci1saW5lXHJcbiAgICAgKiBAcGFyYW0gd2lkdGgge251bWJlcn1cclxuICAgICAqL1xyXG4gICAgc2V0IGxpbmVXaWR0aCh3aWR0aCkge1xyXG4gICAgICAgIHRoaXMuX21hcmtlckxpbmVNYXRlcmlhbC5saW5ld2lkdGggPSB3aWR0aDtcclxuICAgICAgICB0aGlzLl9tYXJrZXJMaW5lTWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyBpZiB0aGlzIG1hcmtlciBjYW4gYmUgc2VlbiB0aHJvdWdoIHRlcnJhaW5cclxuICAgICAqIEBwYXJhbSB0ZXN0IHtib29sZWFufVxyXG4gICAgICovXHJcbiAgICBzZXQgZGVwdGhUZXN0KHRlc3QpIHtcclxuICAgICAgICB0aGlzLl9tYXJrZXJGaWxsTWF0ZXJpYWwuZGVwdGhUZXN0ID0gdGVzdDtcclxuICAgICAgICB0aGlzLl9tYXJrZXJGaWxsTWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuICAgICAgICB0aGlzLl9tYXJrZXJMaW5lTWF0ZXJpYWwuZGVwdGhUZXN0ID0gdGVzdDtcclxuICAgICAgICB0aGlzLl9tYXJrZXJMaW5lTWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBkZXB0aFRlc3QoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hcmtlckZpbGxNYXRlcmlhbC5kZXB0aFRlc3Q7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBtaW4taGVpZ2h0IG9mIHRoaXMgbWFya2VyXHJcbiAgICAgKiBAcGFyYW0gaGVpZ2h0IHtudW1iZXJ9XHJcbiAgICAgKi9cclxuICAgIHNldCBtaW5IZWlnaHQoaGVpZ2h0KSB7XHJcbiAgICAgICAgdGhpcy5fbWluSGVpZ2h0ID0gaGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgbWF4LWhlaWdodCBvZiB0aGlzIG1hcmtlclxyXG4gICAgICogQHBhcmFtIGhlaWdodCB7bnVtYmVyfVxyXG4gICAgICovXHJcbiAgICBzZXQgbWF4SGVpZ2h0KGhlaWdodCkge1xyXG4gICAgICAgIHRoaXMuX21hcmtlck9iamVjdC5wb3NpdGlvbi55ID0gaGVpZ2h0ICsgMC4wMTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHBvaW50cyBmb3IgdGhlIHNoYXBlIG9mIHRoaXMgbWFya2VyLlxyXG4gICAgICogQHBhcmFtIHBvaW50cyB7VmVjdG9yMltdfVxyXG4gICAgICovXHJcbiAgICBzZXQgc2hhcGUocG9pbnRzKSB7XHJcblxyXG4gICAgICAgIC8vIHJlbW92ZSBvbGQgbWFya2VyXHJcbiAgICAgICAgdGhpcy5fbWFya2VyT2JqZWN0LmNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4ge1xyXG4gICAgICAgICAgICBpZiAoY2hpbGQuZ2VvbWV0cnkgJiYgY2hpbGQuZ2VvbWV0cnkuaXNHZW9tZXRyeSkgY2hpbGQuZ2VvbWV0cnkuZGlzcG9zZSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuX21hcmtlck9iamVjdC5jbGVhcigpO1xyXG5cclxuICAgICAgICBpZiAocG9pbnRzLmxlbmd0aCA8IDMpIHJldHVybjtcclxuXHJcbiAgICAgICAgdGhpcy5fbWFya2VyT2JqZWN0LnBvc2l0aW9uLnggPSB0aGlzLnBvc2l0aW9uLnggKyAwLjAxO1xyXG4gICAgICAgIHRoaXMuX21hcmtlck9iamVjdC5wb3NpdGlvbi56ID0gdGhpcy5wb3NpdGlvbi56ICsgMC4wMTtcclxuXHJcbiAgICAgICAgbGV0IG1heFkgPSB0aGlzLl9tYXJrZXJPYmplY3QucG9zaXRpb24ueTtcclxuICAgICAgICBsZXQgbWluWSA9IHRoaXMuX21pbkhlaWdodDtcclxuICAgICAgICBsZXQgZGVwdGggPSBtYXhZIC0gbWluWTtcclxuXHJcbiAgICAgICAgbGV0IHNoYXBlID0gbmV3IFNoYXBlKHBvaW50cyk7XHJcblxyXG4gICAgICAgIC8vIGJvcmRlci1saW5lXHJcbiAgICAgICAgaWYgKHRoaXMuX21hcmtlckxpbmVNYXRlcmlhbC5vcGFjaXR5ID4gMCkge1xyXG4gICAgICAgICAgICBsZXQgcG9pbnRzM2QgPSBbXTtcclxuICAgICAgICAgICAgcG9pbnRzLmZvckVhY2gocG9pbnQgPT4gcG9pbnRzM2QucHVzaChwb2ludC54LCAwLCBwb2ludC55KSk7XHJcbiAgICAgICAgICAgIHBvaW50czNkLnB1c2gocG9pbnRzWzBdLngsIDAsIHBvaW50c1swXS55KVxyXG5cclxuICAgICAgICAgICAgY29uc3QgcHJlUmVuZGVySG9vayA9IGxpbmUgPT4gcmVuZGVyZXIgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVuZGVyZXIuZ2V0U2l6ZShsaW5lLm1hdGVyaWFsLnJlc29sdXRpb24pO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgbGV0IHRvcExpbmVHZW8gPSBuZXcgTGluZUdlb21ldHJ5KClcclxuICAgICAgICAgICAgdG9wTGluZUdlby5zZXRQb3NpdGlvbnMocG9pbnRzM2QpO1xyXG4gICAgICAgICAgICB0b3BMaW5lR2VvLnRyYW5zbGF0ZSgtdGhpcy5wb3NpdGlvbi54LCAwLCAtdGhpcy5wb3NpdGlvbi56KTtcclxuICAgICAgICAgICAgbGV0IHRvcExpbmUgPSBuZXcgTGluZTIodG9wTGluZUdlbywgdGhpcy5fbWFya2VyTGluZU1hdGVyaWFsKTtcclxuICAgICAgICAgICAgdG9wTGluZS5jb21wdXRlTGluZURpc3RhbmNlcygpO1xyXG4gICAgICAgICAgICB0b3BMaW5lLm9uQmVmb3JlUmVuZGVyID0gcHJlUmVuZGVySG9vayh0b3BMaW5lKTtcclxuICAgICAgICAgICAgdGhpcy5fbWFya2VyT2JqZWN0LmFkZCh0b3BMaW5lKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBib3R0b21MaW5lID0gdG9wTGluZS5jbG9uZSgpO1xyXG4gICAgICAgICAgICBib3R0b21MaW5lLnBvc2l0aW9uLnkgPSAtZGVwdGg7XHJcbiAgICAgICAgICAgIGJvdHRvbUxpbmUuY29tcHV0ZUxpbmVEaXN0YW5jZXMoKTtcclxuICAgICAgICAgICAgYm90dG9tTGluZS5vbkJlZm9yZVJlbmRlciA9IHByZVJlbmRlckhvb2soYm90dG9tTGluZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX21hcmtlck9iamVjdC5hZGQoYm90dG9tTGluZSk7XHJcblxyXG4gICAgICAgICAgICBwb2ludHMuZm9yRWFjaChwb2ludCA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcG9pbnRMaW5lR2VvID0gbmV3IExpbmVHZW9tZXRyeSgpO1xyXG4gICAgICAgICAgICAgICAgcG9pbnRMaW5lR2VvLnNldFBvc2l0aW9ucyhbXHJcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQueCwgMCwgcG9pbnQueSxcclxuICAgICAgICAgICAgICAgICAgICBwb2ludC54LCAtZGVwdGgsIHBvaW50LnlcclxuICAgICAgICAgICAgICAgIF0pXHJcbiAgICAgICAgICAgICAgICBwb2ludExpbmVHZW8udHJhbnNsYXRlKC10aGlzLnBvc2l0aW9uLngsIDAsIC10aGlzLnBvc2l0aW9uLnopO1xyXG4gICAgICAgICAgICAgICAgbGV0IHBvaW50TGluZSA9IG5ldyBMaW5lMihwb2ludExpbmVHZW8sIHRoaXMuX21hcmtlckxpbmVNYXRlcmlhbCk7XHJcbiAgICAgICAgICAgICAgICBwb2ludExpbmUuY29tcHV0ZUxpbmVEaXN0YW5jZXMoKTtcclxuICAgICAgICAgICAgICAgIHBvaW50TGluZS5vbkJlZm9yZVJlbmRlciA9IHByZVJlbmRlckhvb2socG9pbnRMaW5lKTtcclxuICAgICAgICAgICAgICAgIHBvaW50TGluZS5tYXJrZXIgPSB0aGlzO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFya2VyT2JqZWN0LmFkZChwb2ludExpbmUpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGZpbGxcclxuICAgICAgICBpZiAodGhpcy5fbWFya2VyRmlsbE1hdGVyaWFsLnVuaWZvcm1zLm1hcmtlckNvbG9yLnZhbHVlLncgPiAwKSB7XHJcbiAgICAgICAgICAgIGxldCBmaWxsR2VvID0gbmV3IEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeShzaGFwZSwge1xyXG4gICAgICAgICAgICAgICAgc3RlcHM6IDEsXHJcbiAgICAgICAgICAgICAgICBkZXB0aDogZGVwdGgsXHJcbiAgICAgICAgICAgICAgICBiZXZlbEVuYWJsZWQ6IGZhbHNlXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBmaWxsR2VvLnJvdGF0ZVgoTWF0aC5QSSAvIDIpOyAvL21ha2UgeSB0byB6XHJcbiAgICAgICAgICAgIGZpbGxHZW8udHJhbnNsYXRlKC10aGlzLnBvc2l0aW9uLngsIDAsIC10aGlzLnBvc2l0aW9uLnopO1xyXG4gICAgICAgICAgICBsZXQgZmlsbCA9IG5ldyBNZXNoKGZpbGxHZW8sIHRoaXMuX21hcmtlckZpbGxNYXRlcmlhbCk7XHJcbiAgICAgICAgICAgIGZpbGwub25CZWZvcmVSZW5kZXIgPSAocmVuZGVyZXIsIHNjZW5lLCBjYW1lcmEpID0+IHRoaXMuX29uQmVmb3JlUmVuZGVyKHJlbmRlcmVyLCBzY2VuZSwgY2FtZXJhKTtcclxuICAgICAgICAgICAgZmlsbC5tYXJrZXIgPSB0aGlzO1xyXG4gICAgICAgICAgICB0aGlzLl9tYXJrZXJPYmplY3QuYWRkKGZpbGwpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gcHV0IHJlbmRlci1ob29rIG9uIGxpbmUgKG9ubHkpIGlmIHRoZXJlIGlzIG5vIGZpbGxcclxuICAgICAgICBlbHNlIGlmICh0aGlzLl9tYXJrZXJPYmplY3QuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBsZXQgb2xkSG9vayA9IHRoaXMuX21hcmtlck9iamVjdC5jaGlsZHJlblswXS5vbkJlZm9yZVJlbmRlcjtcclxuICAgICAgICAgICAgdGhpcy5fbWFya2VyT2JqZWN0LmNoaWxkcmVuWzBdLm9uQmVmb3JlUmVuZGVyID0gKHJlbmRlcmVyLCBzY2VuZSwgY2FtZXJhLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkJlZm9yZVJlbmRlcihyZW5kZXJlciwgc2NlbmUsIGNhbWVyYSk7XHJcbiAgICAgICAgICAgICAgICBvbGRIb29rKHJlbmRlcmVyLCBzY2VuZSwgY2FtZXJhLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbn0iLCIvKipcclxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cclxuICpcclxuICogYWRhcHRlZCBmb3IgYmx1ZW1hcCdzIHB1cnBvc2VzXHJcbiAqL1xyXG5cclxuaW1wb3J0IHtcclxuICAgIE1hdHJpeDQsXHJcbiAgICBPYmplY3QzRCwgVmVjdG9yMixcclxuICAgIFZlY3RvcjNcclxufSBmcm9tIFwidGhyZWVcIjtcclxuXHJcbnZhciBDU1MyRE9iamVjdCA9IGZ1bmN0aW9uICggZWxlbWVudCApIHtcclxuXHJcbiAgICBPYmplY3QzRC5jYWxsKCB0aGlzICk7XHJcblxyXG4gICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcclxuICAgIHRoaXMuZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XHJcblxyXG4gICAgdGhpcy5hbmNob3IgPSBuZXcgVmVjdG9yMigpO1xyXG5cclxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lciggJ3JlbW92ZWQnLCBmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICAgIHRoaXMudHJhdmVyc2UoIGZ1bmN0aW9uICggb2JqZWN0ICkge1xyXG5cclxuICAgICAgICAgICAgaWYgKCBvYmplY3QuZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgb2JqZWN0LmVsZW1lbnQucGFyZW50Tm9kZSAhPT0gbnVsbCApIHtcclxuXHJcbiAgICAgICAgICAgICAgICBvYmplY3QuZWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBvYmplY3QuZWxlbWVudCApO1xyXG5cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9ICk7XHJcblxyXG4gICAgfSApO1xyXG5cclxufTtcclxuXHJcbkNTUzJET2JqZWN0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApO1xyXG5DU1MyRE9iamVjdC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDU1MyRE9iamVjdDtcclxuXHJcbi8vXHJcblxyXG52YXIgQ1NTMkRSZW5kZXJlciA9IGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIHZhciBfd2lkdGgsIF9oZWlnaHQ7XHJcbiAgICB2YXIgX3dpZHRoSGFsZiwgX2hlaWdodEhhbGY7XHJcblxyXG4gICAgdmFyIHZlY3RvciA9IG5ldyBWZWN0b3IzKCk7XHJcbiAgICB2YXIgdmlld01hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XHJcbiAgICB2YXIgdmlld1Byb2plY3Rpb25NYXRyaXggPSBuZXcgTWF0cml4NCgpO1xyXG5cclxuICAgIHZhciBjYWNoZSA9IHtcclxuICAgICAgICBvYmplY3RzOiBuZXcgV2Vha01hcCgpXHJcbiAgICB9O1xyXG5cclxuICAgIHZhciBkb21FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ2RpdicgKTtcclxuICAgIGRvbUVsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcclxuXHJcbiAgICB0aGlzLmRvbUVsZW1lbnQgPSBkb21FbGVtZW50O1xyXG5cclxuICAgIHRoaXMuZ2V0U2l6ZSA9IGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgd2lkdGg6IF93aWR0aCxcclxuICAgICAgICAgICAgaGVpZ2h0OiBfaGVpZ2h0XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuc2V0U2l6ZSA9IGZ1bmN0aW9uICggd2lkdGgsIGhlaWdodCApIHtcclxuXHJcbiAgICAgICAgX3dpZHRoID0gd2lkdGg7XHJcbiAgICAgICAgX2hlaWdodCA9IGhlaWdodDtcclxuXHJcbiAgICAgICAgX3dpZHRoSGFsZiA9IF93aWR0aCAvIDI7XHJcbiAgICAgICAgX2hlaWdodEhhbGYgPSBfaGVpZ2h0IC8gMjtcclxuXHJcbiAgICAgICAgZG9tRWxlbWVudC5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JztcclxuICAgICAgICBkb21FbGVtZW50LnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7XHJcblxyXG4gICAgfTtcclxuXHJcbiAgICB2YXIgcmVuZGVyT2JqZWN0ID0gZnVuY3Rpb24gKCBvYmplY3QsIHNjZW5lLCBjYW1lcmEgKSB7XHJcblxyXG4gICAgICAgIGlmICggb2JqZWN0IGluc3RhbmNlb2YgQ1NTMkRPYmplY3QgKSB7XHJcblxyXG4gICAgICAgICAgICBvYmplY3Qub25CZWZvcmVSZW5kZXIoIF90aGlzLCBzY2VuZSwgY2FtZXJhICk7XHJcblxyXG4gICAgICAgICAgICB2ZWN0b3Iuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBvYmplY3QubWF0cml4V29ybGQgKTtcclxuICAgICAgICAgICAgdmVjdG9yLmFwcGx5TWF0cml4NCggdmlld1Byb2plY3Rpb25NYXRyaXggKTtcclxuXHJcbiAgICAgICAgICAgIHZhciBlbGVtZW50ID0gb2JqZWN0LmVsZW1lbnQ7XHJcbiAgICAgICAgICAgIHZhciBzdHlsZSA9ICd0cmFuc2xhdGUoJyArICggdmVjdG9yLnggKiBfd2lkdGhIYWxmICsgX3dpZHRoSGFsZiAtIG9iamVjdC5hbmNob3IueCkgKyAncHgsJyArICggLSB2ZWN0b3IueSAqIF9oZWlnaHRIYWxmICsgX2hlaWdodEhhbGYgLSBvYmplY3QuYW5jaG9yLnkgKSArICdweCknO1xyXG5cclxuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5XZWJraXRUcmFuc2Zvcm0gPSBzdHlsZTtcclxuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5Nb3pUcmFuc2Zvcm0gPSBzdHlsZTtcclxuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5vVHJhbnNmb3JtID0gc3R5bGU7XHJcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gc3R5bGU7XHJcblxyXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAoIG9iamVjdC52aXNpYmxlICYmIHZlY3Rvci56ID49IC0gMSAmJiB2ZWN0b3IueiA8PSAxICkgPyAnJyA6ICdub25lJztcclxuXHJcbiAgICAgICAgICAgIHZhciBvYmplY3REYXRhID0ge1xyXG4gICAgICAgICAgICAgICAgZGlzdGFuY2VUb0NhbWVyYVNxdWFyZWQ6IGdldERpc3RhbmNlVG9TcXVhcmVkKCBjYW1lcmEsIG9iamVjdCApXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBjYWNoZS5vYmplY3RzLnNldCggb2JqZWN0LCBvYmplY3REYXRhICk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIGVsZW1lbnQucGFyZW50Tm9kZSAhPT0gZG9tRWxlbWVudCApIHtcclxuXHJcbiAgICAgICAgICAgICAgICBkb21FbGVtZW50LmFwcGVuZENoaWxkKCBlbGVtZW50ICk7XHJcblxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBvYmplY3Qub25BZnRlclJlbmRlciggX3RoaXMsIHNjZW5lLCBjYW1lcmEgKTtcclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKCB2YXIgaSA9IDAsIGwgPSBvYmplY3QuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcbiAgICAgICAgICAgIHJlbmRlck9iamVjdCggb2JqZWN0LmNoaWxkcmVuWyBpIF0sIHNjZW5lLCBjYW1lcmEgKTtcclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgIH07XHJcblxyXG4gICAgdmFyIGdldERpc3RhbmNlVG9TcXVhcmVkID0gZnVuY3Rpb24gKCkge1xyXG5cclxuICAgICAgICB2YXIgYSA9IG5ldyBWZWN0b3IzKCk7XHJcbiAgICAgICAgdmFyIGIgPSBuZXcgVmVjdG9yMygpO1xyXG5cclxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCBvYmplY3QxLCBvYmplY3QyICkge1xyXG5cclxuICAgICAgICAgICAgYS5zZXRGcm9tTWF0cml4UG9zaXRpb24oIG9iamVjdDEubWF0cml4V29ybGQgKTtcclxuICAgICAgICAgICAgYi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIG9iamVjdDIubWF0cml4V29ybGQgKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBhLmRpc3RhbmNlVG9TcXVhcmVkKCBiICk7XHJcblxyXG4gICAgICAgIH07XHJcblxyXG4gICAgfSgpO1xyXG5cclxuICAgIHZhciBmaWx0ZXJBbmRGbGF0dGVuID0gZnVuY3Rpb24gKCBzY2VuZSApIHtcclxuXHJcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xyXG5cclxuICAgICAgICBzY2VuZS50cmF2ZXJzZSggZnVuY3Rpb24gKCBvYmplY3QgKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAoIG9iamVjdCBpbnN0YW5jZW9mIENTUzJET2JqZWN0ICkgcmVzdWx0LnB1c2goIG9iamVjdCApO1xyXG5cclxuICAgICAgICB9ICk7XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcblxyXG4gICAgfTtcclxuXHJcbiAgICB2YXIgek9yZGVyID0gZnVuY3Rpb24gKCBzY2VuZSApIHtcclxuXHJcbiAgICAgICAgdmFyIHNvcnRlZCA9IGZpbHRlckFuZEZsYXR0ZW4oIHNjZW5lICkuc29ydCggZnVuY3Rpb24gKCBhLCBiICkge1xyXG5cclxuICAgICAgICAgICAgdmFyIGRpc3RhbmNlQSA9IGNhY2hlLm9iamVjdHMuZ2V0KCBhICkuZGlzdGFuY2VUb0NhbWVyYVNxdWFyZWQ7XHJcbiAgICAgICAgICAgIHZhciBkaXN0YW5jZUIgPSBjYWNoZS5vYmplY3RzLmdldCggYiApLmRpc3RhbmNlVG9DYW1lcmFTcXVhcmVkO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGRpc3RhbmNlQSAtIGRpc3RhbmNlQjtcclxuXHJcbiAgICAgICAgfSApO1xyXG5cclxuICAgICAgICB2YXIgek1heCA9IHNvcnRlZC5sZW5ndGg7XHJcblxyXG4gICAgICAgIGZvciAoIHZhciBpID0gMCwgbCA9IHNvcnRlZC5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuICAgICAgICAgICAgc29ydGVkWyBpIF0uZWxlbWVudC5zdHlsZS56SW5kZXggPSB6TWF4IC0gaTtcclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5yZW5kZXIgPSBmdW5jdGlvbiAoIHNjZW5lLCBjYW1lcmEgKSB7XHJcblxyXG4gICAgICAgIGlmICggc2NlbmUuYXV0b1VwZGF0ZSA9PT0gdHJ1ZSApIHNjZW5lLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XHJcbiAgICAgICAgaWYgKCBjYW1lcmEucGFyZW50ID09PSBudWxsICkgY2FtZXJhLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XHJcblxyXG4gICAgICAgIHZpZXdNYXRyaXguY29weSggY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSApO1xyXG4gICAgICAgIHZpZXdQcm9qZWN0aW9uTWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LCB2aWV3TWF0cml4ICk7XHJcblxyXG4gICAgICAgIHJlbmRlck9iamVjdCggc2NlbmUsIHNjZW5lLCBjYW1lcmEgKTtcclxuICAgICAgICB6T3JkZXIoIHNjZW5lICk7XHJcblxyXG4gICAgfTtcclxuXHJcbn07XHJcblxyXG5leHBvcnQgeyBDU1MyRE9iamVjdCwgQ1NTMkRSZW5kZXJlciB9OyIsImltcG9ydCB7TWFya2VyfSBmcm9tIFwiLi9NYXJrZXJcIjtcclxuaW1wb3J0IHtDU1MyRE9iamVjdH0gZnJvbSBcIi4uL3V0aWwvQ1NTMkRSZW5kZXJlclwiO1xyXG5pbXBvcnQge2h0bWxUb0VsZW1lbnR9IGZyb20gXCIuLi91dGlsL1V0aWxzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgSFRNTE1hcmtlciBleHRlbmRzIE1hcmtlciB7XHJcblxyXG4gICAgY29uc3RydWN0b3IobWFya2VyU2V0LCBpZCwgcGFyZW50T2JqZWN0KSB7XHJcbiAgICAgICAgc3VwZXIobWFya2VyU2V0LCBpZCk7XHJcblxyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnaXNIVE1MTWFya2VyJywge3ZhbHVlOiB0cnVlfSk7XHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICd0eXBlJywge3ZhbHVlOiBcImh0bWxcIn0pO1xyXG5cclxuICAgICAgICB0aGlzLl9tYXJrZXJFbGVtZW50ID0gaHRtbFRvRWxlbWVudChgPGRpdiBpZD1cImJtLW1hcmtlci0ke3RoaXMuaWR9XCIgY2xhc3M9XCJibS1tYXJrZXItJHt0aGlzLnR5cGV9XCI+PC9kaXY+YCk7XHJcbiAgICAgICAgdGhpcy5fbWFya2VyRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50ID0+IHRoaXMub25DbGljayh0aGlzLnBvc2l0aW9uKSk7XHJcbiAgICAgICAgdGhpcy5fbWFya2VyT2JqZWN0ID0gbmV3IENTUzJET2JqZWN0KHRoaXMuX21hcmtlckVsZW1lbnQpO1xyXG4gICAgICAgIHRoaXMuX21hcmtlck9iamVjdC5wb3NpdGlvbi5jb3B5KHRoaXMucG9zaXRpb24pO1xyXG4gICAgICAgIHRoaXMuX21hcmtlck9iamVjdC5vbkJlZm9yZVJlbmRlciA9IChyZW5kZXJlciwgc2NlbmUsIGNhbWVyYSkgPT4gdGhpcy5fb25CZWZvcmVSZW5kZXIocmVuZGVyZXIsIHNjZW5lLCBjYW1lcmEpO1xyXG5cclxuICAgICAgICBwYXJlbnRPYmplY3QuYWRkKHRoaXMuX21hcmtlck9iamVjdCk7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlKG1hcmtlckRhdGEpIHtcclxuICAgICAgICBzdXBlci51cGRhdGUobWFya2VyRGF0YSk7XHJcblxyXG4gICAgICAgIGlmIChtYXJrZXJEYXRhLmh0bWwpIHtcclxuICAgICAgICAgICAgdGhpcy5odG1sID0gbWFya2VyRGF0YS5odG1sO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG1hcmtlckRhdGEuYW5jaG9yKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0QW5jaG9yKHBhcnNlSW50KG1hcmtlckRhdGEuYW5jaG9yLngpLCBwYXJzZUludChtYXJrZXJEYXRhLmFuY2hvci55KSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIF9vbkJlZm9yZVJlbmRlcihyZW5kZXJlciwgc2NlbmUsIGNhbWVyYSkge1xyXG4gICAgICAgIHN1cGVyLl9vbkJlZm9yZVJlbmRlcihyZW5kZXJlciwgc2NlbmUsIGNhbWVyYSk7XHJcblxyXG4gICAgICAgIHRoaXMuX21hcmtlckVsZW1lbnQuc3R5bGUub3BhY2l0eSA9IHRoaXMuX29wYWNpdHk7XHJcbiAgICAgICAgdGhpcy5fbWFya2VyRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJkYXRhLWRpc3RhbmNlXCIsIE1hdGgucm91bmQodGhpcy5fZGlzdGFuY2UpKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX29wYWNpdHkgPD0gMCl7XHJcbiAgICAgICAgICAgIHRoaXMuX21hcmtlckVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9IFwibm9uZVwiO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX21hcmtlckVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9IFwiYXV0b1wiO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBkaXNwb3NlKCkge1xyXG4gICAgICAgIHRoaXMuX21hcmtlck9iamVjdC5wYXJlbnQucmVtb3ZlKHRoaXMuX21hcmtlck9iamVjdCk7XHJcblxyXG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXQgaHRtbChodG1sKSB7XHJcbiAgICAgICAgdGhpcy5fbWFya2VyRWxlbWVudC5pbm5lckhUTUwgPSBodG1sO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEFuY2hvcih4LCB5KSB7XHJcbiAgICAgICAgdGhpcy5fbWFya2VyT2JqZWN0LmFuY2hvci5zZXQoeCwgeSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0UG9zaXRpb24oeCwgeSwgeikge1xyXG4gICAgICAgIHN1cGVyLnNldFBvc2l0aW9uKHgsIHksIHopO1xyXG4gICAgICAgIHRoaXMuX21hcmtlck9iamVjdC5wb3NpdGlvbi5zZXQoeCwgeSwgeik7XHJcbiAgICB9XHJcblxyXG59IiwiaW1wb3J0IHtIVE1MTWFya2VyfSBmcm9tIFwiLi9IVE1MTWFya2VyXCI7XHJcbmltcG9ydCB7ZGlzcGF0Y2hFdmVudH0gZnJvbSBcIi4uL3V0aWwvVXRpbHNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBQT0lNYXJrZXIgZXh0ZW5kcyBIVE1MTWFya2VyIHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihtYXJrZXJTZXQsIGlkLCBwYXJlbnRPYmplY3QpIHtcclxuICAgICAgICBzdXBlcihtYXJrZXJTZXQsIGlkLCBwYXJlbnRPYmplY3QpO1xyXG4gICAgICAgIHRoaXMuX21hcmtlckVsZW1lbnQuY2xhc3NMaXN0LmFkZChcImJtLW1hcmtlci1wb2lcIik7XHJcblxyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnaXNQT0lNYXJrZXInLCB7dmFsdWU6IHRydWV9KTtcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGUobWFya2VyRGF0YSkge1xyXG4gICAgICAgIHN1cGVyLnVwZGF0ZShtYXJrZXJEYXRhKTtcclxuXHJcbiAgICAgICAgdGhpcy5pY29uID0gbWFya2VyRGF0YS5pY29uID8gbWFya2VyRGF0YS5pY29uIDogXCJhc3NldHMvcG9pLnN2Z1wiO1xyXG5cclxuICAgICAgICAvL2JhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciBcImljb25BbmNob3JcIlxyXG4gICAgICAgIGlmICghbWFya2VyRGF0YS5hbmNob3IpIHtcclxuICAgICAgICAgICAgaWYgKG1hcmtlckRhdGEuaWNvbkFuY2hvcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRBbmNob3IocGFyc2VJbnQobWFya2VyRGF0YS5pY29uQW5jaG9yLngpLCBwYXJzZUludChtYXJrZXJEYXRhLmljb25BbmNob3IueSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uQ2xpY2soY2xpY2tQb3NpdGlvbikge1xyXG4gICAgICAgIGlmICghZGlzcGF0Y2hFdmVudCh0aGlzLm1hbmFnZXIuZXZlbnRzLCAnYmx1ZW1hcE1hcmtlckNsaWNrJywge21hcmtlcjogdGhpc30pKSByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMuZm9sbG93TGluaygpO1xyXG5cclxuICAgICAgICB0aGlzLl9tYXJrZXJFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJibS1tYXJrZXItcG9pLXNob3ctbGFiZWxcIik7XHJcblxyXG4gICAgICAgIGxldCBvblJlbW92ZUxhYmVsID0gKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9tYXJrZXJFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoXCJibS1tYXJrZXItcG9pLXNob3ctbGFiZWxcIik7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5tYW5hZ2VyLmV2ZW50cy5hZGRFdmVudExpc3RlbmVyKCdibHVlbWFwUG9wdXBNYXJrZXInLCBvblJlbW92ZUxhYmVsLCB7b25jZTogdHJ1ZX0pO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLm1hbmFnZXIuZXZlbnRzLmFkZEV2ZW50TGlzdGVuZXIoJ2JsdWVtYXBDYW1lcmFNb3ZlZCcsIG9uUmVtb3ZlTGFiZWwsIHtvbmNlOiB0cnVlfSk7XHJcbiAgICAgICAgfSwgMTAwMCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IGxhYmVsKGxhYmVsKXtcclxuICAgICAgICB0aGlzLl9sYWJlbCA9IGxhYmVsO1xyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZUh0bWwoKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXQgaWNvbihpY29uKSB7XHJcbiAgICAgICAgdGhpcy5faWNvbiA9IGljb247XHJcblxyXG4gICAgICAgIHRoaXMudXBkYXRlSHRtbCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZUh0bWwoKSB7XHJcbiAgICAgICAgbGV0IGxhYmVsSHRtbCA9ICcnO1xyXG4gICAgICAgIGlmICh0aGlzLl9sYWJlbCkgbGFiZWxIdG1sID0gYDxkaXYgY2xhc3M9XCJibS1tYXJrZXItcG9pLWxhYmVsXCI+JHt0aGlzLl9sYWJlbH08L2Rpdj5gO1xyXG5cclxuICAgICAgICB0aGlzLmh0bWwgPSBgPGltZyBzcmM9XCIke3RoaXMuX2ljb259XCIgYWx0PVwiUE9JLSR7dGhpcy5pZH1cIiBkcmFnZ2FibGU9XCJmYWxzZVwiPiR7bGFiZWxIdG1sfWA7XHJcbiAgICB9XHJcblxyXG59IiwiaW1wb3J0IHtIVE1MTWFya2VyfSBmcm9tIFwiLi9IVE1MTWFya2VyXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgUGxheWVyTWFya2VyIGV4dGVuZHMgSFRNTE1hcmtlciB7XHJcblxyXG4gICAgY29uc3RydWN0b3IobWFya2VyU2V0LCBpZCwgcGFyZW50T2JqZWN0LCBwbGF5ZXJVdWlkKSB7XHJcbiAgICAgICAgc3VwZXIobWFya2VyU2V0LCBpZCwgcGFyZW50T2JqZWN0KTtcclxuICAgICAgICB0aGlzLl9tYXJrZXJFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJibS1tYXJrZXItcGxheWVyXCIpO1xyXG5cclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2lzUGxheWVyTWFya2VyJywge3ZhbHVlOiB0cnVlfSk7XHJcblxyXG4gICAgICAgIHRoaXMuX25hbWUgPSBpZDtcclxuICAgICAgICB0aGlzLl9oZWFkID0gXCJhc3NldHMvcGxheWVyaGVhZHMvc3RldmUucG5nXCI7XHJcbiAgICAgICAgdGhpcy5wbGF5ZXJVdWlkID0gcGxheWVyVXVpZDtcclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVIdG1sKCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25DbGljayhjbGlja1Bvc2l0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5mb2xsb3dMaW5rKCk7XHJcblxyXG4gICAgICAgIHRoaXMuX21hcmtlckVsZW1lbnQuY2xhc3NMaXN0LmFkZChcImJtLW1hcmtlci1wb2ktc2hvdy1sYWJlbFwiKTtcclxuXHJcbiAgICAgICAgbGV0IG9uUmVtb3ZlTGFiZWwgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX21hcmtlckVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShcImJtLW1hcmtlci1wb2ktc2hvdy1sYWJlbFwiKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLm1hbmFnZXIuZXZlbnRzLmFkZEV2ZW50TGlzdGVuZXIoJ2JsdWVtYXBQb3B1cE1hcmtlcicsIG9uUmVtb3ZlTGFiZWwsIHtvbmNlOiB0cnVlfSk7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubWFuYWdlci5ldmVudHMuYWRkRXZlbnRMaXN0ZW5lcignYmx1ZW1hcENhbWVyYU1vdmVkJywgb25SZW1vdmVMYWJlbCwge29uY2U6IHRydWV9KTtcclxuICAgICAgICB9LCAxMDAwKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXQgbmFtZShuYW1lKXtcclxuICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTtcclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVIdG1sKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IGhlYWQoaGVhZEltYWdlKSB7XHJcbiAgICAgICAgdGhpcy5faGVhZCA9IGhlYWRJbWFnZTtcclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVIdG1sKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlSHRtbCgpIHtcclxuICAgICAgICBsZXQgbGFiZWxIdG1sID0gJyc7XHJcbiAgICAgICAgaWYgKHRoaXMuX25hbWUpIGxhYmVsSHRtbCA9IGA8ZGl2IGNsYXNzPVwiYm0tbWFya2VyLXBvaS1sYWJlbFwiPiR7dGhpcy5fbmFtZX08L2Rpdj5gO1xyXG5cclxuICAgICAgICB0aGlzLmh0bWwgPSBgPGltZyBzcmM9XCIke3RoaXMuX2hlYWR9XCIgYWx0PVwiUGxheWVySGVhZC0ke3RoaXMuaWR9XCIgZHJhZ2dhYmxlPVwiZmFsc2VcIj4ke2xhYmVsSHRtbH1gO1xyXG4gICAgfVxyXG5cclxufSIsImltcG9ydCB7U2hhcGVNYXJrZXJ9IGZyb20gXCIuL1NoYXBlTWFya2VyXCI7XHJcbmltcG9ydCB7T2JqZWN0M0R9IGZyb20gXCJ0aHJlZVwiO1xyXG5pbXBvcnQge0xpbmVNYXJrZXJ9IGZyb20gXCIuL0xpbmVNYXJrZXJcIjtcclxuaW1wb3J0IHtFeHRydWRlTWFya2VyfSBmcm9tIFwiLi9FeHRydWRlTWFya2VyXCI7XHJcbmltcG9ydCB7SFRNTE1hcmtlcn0gZnJvbSBcIi4vSFRNTE1hcmtlclwiO1xyXG5pbXBvcnQge1BPSU1hcmtlcn0gZnJvbSBcIi4vUE9JTWFya2VyXCI7XHJcbmltcG9ydCB7TWFya2VyfSBmcm9tIFwiLi9NYXJrZXJcIjtcclxuaW1wb3J0IHtQbGF5ZXJNYXJrZXJ9IGZyb20gXCIuL1BsYXllck1hcmtlclwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE1hcmtlclNldCB7XHJcblxyXG4gICAgc3RhdGljIFNvdXJjZSA9IHtcclxuICAgICAgICBDVVNUT006IDAsXHJcbiAgICAgICAgTUFSS0VSX0ZJTEU6IDFcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3RvcihtYW5hZ2VyLCBpZCwgbWFwSWQsIGV2ZW50cyA9IG51bGwpIHtcclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2lzTWFya2VyU2V0Jywge3ZhbHVlOiB0cnVlfSk7XHJcblxyXG4gICAgICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7XHJcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xyXG5cclxuICAgICAgICB0aGlzLl9tYXBJZCA9IG1hcElkO1xyXG4gICAgICAgIHRoaXMuX29iamVjdE1hcmtlck9iamVjdCA9IG5ldyBPYmplY3QzRCgpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnRNYXJrZXJPYmplY3QgPSBuZXcgT2JqZWN0M0QoKTtcclxuICAgICAgICB0aGlzLmV2ZW50cyA9IGV2ZW50cztcclxuXHJcbiAgICAgICAgdGhpcy5sYWJlbCA9IHRoaXMuaWQ7XHJcbiAgICAgICAgdGhpcy50b2dnbGVhYmxlID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmRlZmF1bHRIaWRlID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHRoaXMudmlzaWJsZSA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgdGhpcy5fc291cmNlID0gTWFya2VyU2V0LlNvdXJjZS5DVVNUT007XHJcblxyXG4gICAgICAgIHRoaXMuX21hcmtlciA9IHt9O1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZShtYXJrZXJTZXREYXRhKSB7XHJcbiAgICAgICAgdGhpcy5fc291cmNlID0gTWFya2VyU2V0LlNvdXJjZS5NQVJLRVJfRklMRTtcclxuXHJcbiAgICAgICAgdGhpcy5sYWJlbCA9IG1hcmtlclNldERhdGEubGFiZWwgPyBtYXJrZXJTZXREYXRhLmxhYmVsIDogdGhpcy5pZDtcclxuICAgICAgICB0aGlzLnRvZ2dsZWFibGUgPSBtYXJrZXJTZXREYXRhLnRvZ2dsZWFibGUgIT09IHVuZGVmaW5lZCA/ICEhbWFya2VyU2V0RGF0YS50b2dnbGVhYmxlIDogdHJ1ZTtcclxuICAgICAgICB0aGlzLmRlZmF1bHRIaWRlID0gISFtYXJrZXJTZXREYXRhLmRlZmF1bHRIaWRlO1xyXG4gICAgICAgIGlmICh0aGlzLnZpc2libGUgPT09IHVuZGVmaW5lZCkgdGhpcy52aXNpYmxlID0gdGhpcy5kZWZhdWx0SGlkZTtcclxuXHJcbiAgICAgICAgbGV0IHByZXZNYXJrZXJzID0gdGhpcy5fbWFya2VyO1xyXG4gICAgICAgIHRoaXMuX21hcmtlciA9IHt9O1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG1hcmtlclNldERhdGEubWFya2VyKSl7XHJcbiAgICAgICAgICAgIGZvciAobGV0IG1hcmtlckRhdGEgb2YgbWFya2VyU2V0RGF0YS5tYXJrZXIpIHtcclxuICAgICAgICAgICAgICAgIGxldCBtYXJrZXJJZCA9IG1hcmtlckRhdGEuaWQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoIW1hcmtlcklkKSBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tYXJrZXJbbWFya2VySWRdKSBjb250aW51ZTsgLy8gc2tpcCBkdXBsaWNhdGUgaWQnc1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBtYXBJZCA9IG1hcmtlckRhdGEubWFwO1xyXG4gICAgICAgICAgICAgICAgaWYgKG1hcElkICE9PSB0aGlzLl9tYXBJZCkgY29udGludWU7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFya2VyW21hcmtlcklkXSA9IHByZXZNYXJrZXJzW21hcmtlcklkXTtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBwcmV2TWFya2Vyc1ttYXJrZXJJZF07XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVNYXJrZXIobWFya2VySWQsIG1hcmtlckRhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL3JlbWFpbmluZyAocmVtb3ZlZCkgbWFya2Vyc1xyXG4gICAgICAgIGZvciAobGV0IG1hcmtlcklkIGluIHByZXZNYXJrZXJzKSB7XHJcbiAgICAgICAgICAgIGlmICghcHJldk1hcmtlcnMuaGFzT3duUHJvcGVydHkobWFya2VySWQpKSBjb250aW51ZTtcclxuICAgICAgICAgICAgaWYgKCFwcmV2TWFya2Vyc1ttYXJrZXJJZF0gfHwgIXByZXZNYXJrZXJzW21hcmtlcklkXS5pc01hcmtlcikgY29udGludWU7XHJcblxyXG4gICAgICAgICAgICAvLyBrZWVwIG1hcmtlcnMgdGhhdCB3ZXJlIG5vdCBsb2FkZWQgZnJvbSB0aGUgbWFya2VyLWZpbGVcclxuICAgICAgICAgICAgaWYgKHByZXZNYXJrZXJzW21hcmtlcklkXS5fc291cmNlICE9PSBNYXJrZXIuU291cmNlLk1BUktFUl9GSUxFKXtcclxuICAgICAgICAgICAgICAgIHRoaXMuX21hcmtlclttYXJrZXJJZF0gPSBwcmV2TWFya2Vyc1ttYXJrZXJJZF07XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcHJldk1hcmtlcnNbbWFya2VySWRdLmRpc3Bvc2UoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlTWFya2VyKG1hcmtlcklkLCBtYXJrZXJEYXRhKXtcclxuICAgICAgICBsZXQgbWFya2VyVHlwZSA9IG1hcmtlckRhdGEudHlwZTtcclxuICAgICAgICBpZiAoIW1hcmtlclR5cGUpIHJldHVybjtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9tYXJrZXJbbWFya2VySWRdIHx8ICF0aGlzLl9tYXJrZXJbbWFya2VySWRdLmlzTWFya2VyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlTWFya2VyKG1hcmtlcklkLCBtYXJrZXJUeXBlKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX21hcmtlclttYXJrZXJJZF0udHlwZSAhPT0gbWFya2VyVHlwZSl7XHJcbiAgICAgICAgICAgIHRoaXMuX21hcmtlclttYXJrZXJJZF0uZGlzcG9zZSgpO1xyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZU1hcmtlcihtYXJrZXJJZCwgbWFya2VyVHlwZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX21hcmtlclttYXJrZXJJZF0pIHJldHVybjtcclxuXHJcbiAgICAgICAgdGhpcy5fbWFya2VyW21hcmtlcklkXS51cGRhdGUobWFya2VyRGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlTWFya2VyKGlkLCB0eXBlKSB7XHJcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJodG1sXCIgOiB0aGlzLl9tYXJrZXJbaWRdID0gbmV3IEhUTUxNYXJrZXIodGhpcywgaWQsIHRoaXMuX2VsZW1lbnRNYXJrZXJPYmplY3QpOyBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcInBvaVwiIDogdGhpcy5fbWFya2VyW2lkXSA9IG5ldyBQT0lNYXJrZXIodGhpcywgaWQsIHRoaXMuX2VsZW1lbnRNYXJrZXJPYmplY3QpOyBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcInNoYXBlXCIgOiB0aGlzLl9tYXJrZXJbaWRdID0gbmV3IFNoYXBlTWFya2VyKHRoaXMsIGlkLCB0aGlzLl9vYmplY3RNYXJrZXJPYmplY3QpOyBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcImxpbmVcIiA6IHRoaXMuX21hcmtlcltpZF0gPSBuZXcgTGluZU1hcmtlcih0aGlzLCBpZCwgdGhpcy5fb2JqZWN0TWFya2VyT2JqZWN0KTsgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJleHRydWRlXCIgOiB0aGlzLl9tYXJrZXJbaWRdID0gbmV3IEV4dHJ1ZGVNYXJrZXIodGhpcywgaWQsIHRoaXMuX29iamVjdE1hcmtlck9iamVjdCk7IGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0IDogcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fbWFya2VyW2lkXTtcclxuICAgIH1cclxuXHJcbiAgICBjcmVhdGVQbGF5ZXJNYXJrZXIocGxheWVyVXVpZCkge1xyXG4gICAgICAgIGxldCBpZCA9IHBsYXllclV1aWQ7XHJcbiAgICAgICAgdGhpcy5fbWFya2VyW2lkXSA9IG5ldyBQbGF5ZXJNYXJrZXIodGhpcywgaWQsIHRoaXMuX2VsZW1lbnRNYXJrZXJPYmplY3QsIHBsYXllclV1aWQpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9tYXJrZXJbaWRdO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBtYXJrZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hcmtlci52YWx1ZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBkaXNwb3NlKCkge1xyXG4gICAgICAgIGxldCBtYXJrZXIgPSB7Li4udGhpcy5fbWFya2VyfTtcclxuICAgICAgICBmb3IgKGxldCBtYXJrZXJJZCBpbiBtYXJrZXIpe1xyXG4gICAgICAgICAgICBpZiAoIW1hcmtlci5oYXNPd25Qcm9wZXJ0eShtYXJrZXJJZCkpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBpZiAoIW1hcmtlclttYXJrZXJJZF0gfHwgIW1hcmtlclttYXJrZXJJZF0uaXNNYXJrZXIpIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAgICAgbWFya2VyW21hcmtlcklkXS5kaXNwb3NlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9tYXJrZXIgPSB7fTtcclxuICAgICAgICBkZWxldGUgdGhpcy5tYW5hZ2VyLm1hcmtlclNldHNbdGhpcy5pZF07XHJcbiAgICB9XHJcblxyXG59IiwiaW1wb3J0IHthbGVydCwgZGlzcGF0Y2hFdmVudH0gZnJvbSBcIi4uL3V0aWwvVXRpbHNcIjtcclxuaW1wb3J0IHtGaWxlTG9hZGVyLCBTY2VuZX0gZnJvbSBcInRocmVlXCI7XHJcbmltcG9ydCB7TWFya2VyU2V0fSBmcm9tIFwiLi9NYXJrZXJTZXRcIjtcclxuaW1wb3J0IHtIVE1MTWFya2VyfSBmcm9tIFwiLi9IVE1MTWFya2VyXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTWFya2VyTWFuYWdlciB7XHJcblxyXG4gICAgY29uc3RydWN0b3IobWFya2VyRmlsZVVybCwgbWFwSWQsIGV2ZW50cyA9IG51bGwpIHtcclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2lzTWFya2VyTWFuYWdlcicsIHt2YWx1ZTogdHJ1ZX0pO1xyXG5cclxuICAgICAgICB0aGlzLm1hcmtlckZpbGVVcmwgPSBtYXJrZXJGaWxlVXJsO1xyXG4gICAgICAgIHRoaXMubWFwSWQgPSBtYXBJZDtcclxuICAgICAgICB0aGlzLmV2ZW50cyA9IGV2ZW50cztcclxuXHJcbiAgICAgICAgdGhpcy5tYXJrZXJTZXRzID0ge307XHJcblxyXG4gICAgICAgIHRoaXMub2JqZWN0TWFya2VyU2NlbmUgPSBuZXcgU2NlbmUoKTsgLy8zZCBtYXJrZXJzXHJcbiAgICAgICAgdGhpcy5lbGVtZW50TWFya2VyU2NlbmUgPSBuZXcgU2NlbmUoKTsgLy9odG1sIG1hcmtlcnNcclxuXHJcbiAgICAgICAgdGhpcy5fcG9wdXBJZCA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRNYXJrZXJzRmlsZSgpXHJcbiAgICAgICAgICAgIC50aGVuKG1hcmtlcnNGaWxlID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCBwcmV2TWFya2VyU2V0cyA9IHRoaXMubWFya2VyU2V0cztcclxuICAgICAgICAgICAgICAgIHRoaXMubWFya2VyU2V0cyA9IHt9O1xyXG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobWFya2Vyc0ZpbGUubWFya2VyU2V0cykpe1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IG1hcmtlclNldERhdGEgb2YgbWFya2Vyc0ZpbGUubWFya2VyU2V0cyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtYXJrZXJTZXRJZCA9IG1hcmtlclNldERhdGEuaWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbWFya2VyU2V0SWQpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXJrZXJTZXRzW21hcmtlclNldElkXSkgY29udGludWU7IC8vIHNraXAgZHVwbGljYXRlIGlkJ3NcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFya2VyU2V0c1ttYXJrZXJTZXRJZF0gPSBwcmV2TWFya2VyU2V0c1ttYXJrZXJTZXRJZF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwcmV2TWFya2VyU2V0c1ttYXJrZXJTZXRJZF07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZU1hcmtlclNldChtYXJrZXJTZXRJZCwgbWFya2VyU2V0RGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vcmVtYWluaW5nIChyZW1vdmVkKSBtYXJrZXJTZXRzXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBtYXJrZXJTZXRJZCBpbiBwcmV2TWFya2VyU2V0cykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghcHJldk1hcmtlclNldHMuaGFzT3duUHJvcGVydHkobWFya2VyU2V0SWQpKSBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXByZXZNYXJrZXJTZXRzW21hcmtlclNldElkXSB8fCAhcHJldk1hcmtlclNldHNbbWFya2VyU2V0SWRdLmlzTWFya2VyU2V0KSBjb250aW51ZTtcclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGtlZXAgbWFya2VyLXNldHMgdGhhdCB3ZXJlIG5vdCBsb2FkZWQgZnJvbSB0aGUgbWFya2VyLWZpbGVcclxuICAgICAgICAgICAgICAgICAgICBpZiAocHJldk1hcmtlclNldHNbbWFya2VyU2V0SWRdLl9zb3VyY2UgIT09IE1hcmtlclNldC5Tb3VyY2UuTUFSS0VSX0ZJTEUpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcmtlclNldHNbbWFya2VyU2V0SWRdID0gcHJldk1hcmtlclNldHNbbWFya2VyU2V0SWRdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHByZXZNYXJrZXJTZXRzW21hcmtlclNldElkXS5kaXNwb3NlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5jYXRjaChyZWFzb24gPT4ge1xyXG4gICAgICAgICAgICAgICAgYWxlcnQodGhpcy5ldmVudHMsIHJlYXNvbiwgXCJ3YXJuaW5nXCIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVNYXJrZXJTZXQobWFya2VyU2V0SWQsIG1hcmtlclNldERhdGEpIHtcclxuICAgICAgICBpZiAoIXRoaXMubWFya2VyU2V0c1ttYXJrZXJTZXRJZF0gfHwgIXRoaXMubWFya2VyU2V0c1ttYXJrZXJTZXRJZF0uaXNNYXJrZXJTZXQpe1xyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZU1hcmtlclNldChtYXJrZXJTZXRJZCk7XHJcbiAgICAgICAgICAgIHRoaXMub2JqZWN0TWFya2VyU2NlbmUuYWRkKHRoaXMubWFya2VyU2V0c1ttYXJrZXJTZXRJZF0uX29iamVjdE1hcmtlck9iamVjdCk7XHJcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudE1hcmtlclNjZW5lLmFkZCh0aGlzLm1hcmtlclNldHNbbWFya2VyU2V0SWRdLl9lbGVtZW50TWFya2VyT2JqZWN0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubWFya2VyU2V0c1ttYXJrZXJTZXRJZF0udXBkYXRlKG1hcmtlclNldERhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZU1hcmtlclNldChpZCkge1xyXG4gICAgICAgIHRoaXMubWFya2VyU2V0c1tpZF0gPSBuZXcgTWFya2VyU2V0KHRoaXMsIGlkLCB0aGlzLm1hcElkLCB0aGlzLmV2ZW50cyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubWFya2VyU2V0c1tpZF07XHJcbiAgICB9XHJcblxyXG4gICAgZGlzcG9zZSgpIHtcclxuICAgICAgICBsZXQgc2V0cyA9IHsuLi50aGlzLm1hcmtlclNldHN9O1xyXG4gICAgICAgIGZvciAobGV0IG1hcmtlclNldElkIGluIHNldHMpe1xyXG4gICAgICAgICAgICBpZiAoIXNldHMuaGFzT3duUHJvcGVydHkobWFya2VyU2V0SWQpKSBjb250aW51ZTtcclxuICAgICAgICAgICAgaWYgKCFzZXRzW21hcmtlclNldElkXSB8fCAhc2V0c1ttYXJrZXJTZXRJZF0uaXNNYXJrZXJTZXQpIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAgICAgc2V0c1ttYXJrZXJTZXRJZF0uZGlzcG9zZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5tYXJrZXJTZXRzID0ge307XHJcbiAgICB9XHJcblxyXG4gICAgc2hvd1BvcHVwKGh0bWwsIHgsIHksIHosIGF1dG9SZW1vdmUgPSB0cnVlLCBvblJlbW92YWwgPSBudWxsKXtcclxuICAgICAgICBsZXQgbWFya2VyID0gbmV3IEhUTUxNYXJrZXIodGhpcywgYHBvcHVwLSR7dGhpcy5fcG9wdXBJZCsrfWAsIHRoaXMuZWxlbWVudE1hcmtlclNjZW5lKTtcclxuICAgICAgICBtYXJrZXIuc2V0UG9zaXRpb24oeCwgeSwgeik7XHJcbiAgICAgICAgbWFya2VyLmh0bWwgPSBodG1sO1xyXG5cclxuICAgICAgICBtYXJrZXIub25EaXNwb3NhbCA9IG9uUmVtb3ZhbDtcclxuXHJcbiAgICAgICAgZGlzcGF0Y2hFdmVudCh0aGlzLmV2ZW50cywgJ2JsdWVtYXBQb3B1cE1hcmtlcicsIHttYXJrZXI6IG1hcmtlcn0pO1xyXG5cclxuICAgICAgICBpZiAoYXV0b1JlbW92ZSl7XHJcbiAgICAgICAgICAgIGxldCBvblJlbW92ZSA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIG1hcmtlci5ibGVuZE91dCgyMDAsIGZpbmlzaGVkID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZmluaXNoZWQpIG1hcmtlci5kaXNwb3NlKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnRzLmFkZEV2ZW50TGlzdGVuZXIoJ2JsdWVtYXBQb3B1cE1hcmtlcicsIG9uUmVtb3ZlLCB7b25jZTogdHJ1ZX0pO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRzLmFkZEV2ZW50TGlzdGVuZXIoJ2JsdWVtYXBDYW1lcmFNb3ZlZCcsIG9uUmVtb3ZlLCB7b25jZTogdHJ1ZX0pO1xyXG4gICAgICAgICAgICB9LCAxMDAwKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG1hcmtlci5ibGVuZEluKDIwMCk7XHJcbiAgICAgICAgcmV0dXJuIG1hcmtlcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIExvYWRzIHRoZSBtYXJrZXJzLmpzb24gZmlsZSBmb3IgdGhpcyBtYXBcclxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59XHJcbiAgICAgKi9cclxuICAgIGxvYWRNYXJrZXJzRmlsZSgpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICBhbGVydCh0aGlzLmV2ZW50cywgYExvYWRpbmcgbWFya2VycyBmcm9tICcke3RoaXMubWFya2VyRmlsZVVybH0nLi4uYCwgXCJmaW5lXCIpO1xyXG5cclxuICAgICAgICAgICAgbGV0IGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCk7XHJcbiAgICAgICAgICAgIGxvYWRlci5zZXRSZXNwb25zZVR5cGUoXCJqc29uXCIpO1xyXG4gICAgICAgICAgICBsb2FkZXIubG9hZCh0aGlzLm1hcmtlckZpbGVVcmwsXHJcbiAgICAgICAgICAgICAgICBtYXJrZXJGaWxlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIW1hcmtlckZpbGUpIHJlamVjdChgRmFpbGVkIHRvIHBhcnNlICcke3RoaXMubWFya2VyRmlsZVVybH0nIWApO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgcmVzb2x2ZShtYXJrZXJGaWxlKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAoKSA9PiB7fSxcclxuICAgICAgICAgICAgICAgICgpID0+IHJlamVjdChgRmFpbGVkIHRvIGxvYWQgJyR7dGhpcy5tYXJrZXJGaWxlVXJsfSchYClcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxufSIsImltcG9ydCB7XHJcblx0Q2xhbXBUb0VkZ2VXcmFwcGluZyxcclxuXHRGaWxlTG9hZGVyLCBGcm9udFNpZGUsIE5lYXJlc3RGaWx0ZXIsIE5lYXJlc3RNaXBNYXBMaW5lYXJGaWx0ZXIsIFJheWNhc3RlcixcclxuXHRTY2VuZSwgU2hhZGVyTWF0ZXJpYWwsIFRleHR1cmUsIFZlY3RvcjIsIFZlY3RvcjMsIFZlcnRleENvbG9yc1xyXG59IGZyb20gXCJ0aHJlZVwiO1xyXG5pbXBvcnQge2FsZXJ0LCBkaXNwYXRjaEV2ZW50LCBoYXNoVGlsZSwgc3RyaW5nVG9JbWFnZX0gZnJvbSBcIi4uL3V0aWwvVXRpbHNcIjtcclxuaW1wb3J0IHtUaWxlTWFuYWdlcn0gZnJvbSBcIi4vVGlsZU1hbmFnZXJcIjtcclxuaW1wb3J0IHtUaWxlTG9hZGVyfSBmcm9tIFwiLi9UaWxlTG9hZGVyXCI7XHJcbmltcG9ydCB7TWFya2VyTWFuYWdlcn0gZnJvbSBcIi4uL21hcmtlcnMvTWFya2VyTWFuYWdlclwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE1hcCB7XHJcblxyXG5cdGNvbnN0cnVjdG9yKGlkLCBkYXRhVXJsLCBldmVudHMgPSBudWxsKSB7XHJcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdpc01hcCcsIHsgdmFsdWU6IHRydWUgfSApO1xyXG5cclxuXHRcdHRoaXMuaWQgPSBpZDtcclxuXHRcdHRoaXMuZXZlbnRzID0gZXZlbnRzO1xyXG5cdFx0dGhpcy5kYXRhVXJsID0gZGF0YVVybDtcclxuXHJcblx0XHR0aGlzLm5hbWUgPSB0aGlzLmlkO1xyXG5cdFx0dGhpcy53b3JsZCA9IFwiLVwiO1xyXG5cclxuXHRcdHRoaXMuc3RhcnRQb3MgPSB7eDogMCwgejogMH07XHJcblx0XHR0aGlzLnNreUNvbG9yID0ge3I6IDAsIGc6IDAsIGI6IDB9O1xyXG5cdFx0dGhpcy5hbWJpZW50TGlnaHQgPSAwO1xyXG5cclxuXHRcdHRoaXMuaGlyZXMgPSB7XHJcblx0XHRcdHRpbGVTaXplOiB7eDogMzIsIHo6IDMyfSxcclxuXHRcdFx0c2NhbGU6IHt4OiAxLCB6OiAxfSxcclxuXHRcdFx0dHJhbnNsYXRlOiB7eDogMiwgejogMn1cclxuXHRcdH07XHJcblx0XHR0aGlzLmxvd3JlcyA9IHtcclxuXHRcdFx0dGlsZVNpemU6IHt4OiAzMiwgejogMzJ9LFxyXG5cdFx0XHRzY2FsZToge3g6IDEsIHo6IDF9LFxyXG5cdFx0XHR0cmFuc2xhdGU6IHt4OiAyLCB6OiAyfVxyXG5cdFx0fTtcclxuXHJcblx0XHR0aGlzLnNjZW5lID0gbmV3IFNjZW5lKCk7XHJcblx0XHR0aGlzLnNjZW5lLmF1dG9VcGRhdGUgPSBmYWxzZTtcclxuXHJcblx0XHR0aGlzLnJheWNhc3RlciA9IG5ldyBSYXljYXN0ZXIoKTtcclxuXHJcblx0XHR0aGlzLmhpcmVzTWF0ZXJpYWwgPSBudWxsO1xyXG5cdFx0dGhpcy5sb3dyZXNNYXRlcmlhbCA9IG51bGw7XHJcblx0XHR0aGlzLmxvYWRlZFRleHR1cmVzID0gW107XHJcblxyXG5cdFx0dGhpcy5oaXJlc1RpbGVNYW5hZ2VyID0gbnVsbDtcclxuXHRcdHRoaXMubG93cmVzVGlsZU1hbmFnZXIgPSBudWxsO1xyXG5cclxuXHRcdHRoaXMubWFya2VyTWFuYWdlciA9IG5ldyBNYXJrZXJNYW5hZ2VyKHRoaXMuZGF0YVVybCArIFwiLi4vbWFya2Vycy5qc29uXCIsIHRoaXMuaWQsIHRoaXMuZXZlbnRzKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIExvYWRzIHRleHR1cmVzIGFuZCBtYXRlcmlhbHMgZm9yIHRoaXMgbWFwIHNvIGl0IGlzIHJlYWR5IHRvIGxvYWQgbWFwLXRpbGVzXHJcblx0ICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XHJcblx0ICovXHJcblx0bG9hZChoaXJlc1ZlcnRleFNoYWRlciwgaGlyZXNGcmFnbWVudFNoYWRlciwgbG93cmVzVmVydGV4U2hhZGVyLCBsb3dyZXNGcmFnbWVudFNoYWRlciwgdW5pZm9ybXMpIHtcclxuXHRcdHRoaXMudW5sb2FkKClcclxuXHJcblx0XHRsZXQgc2V0dGluZ3NGaWxlUHJvbWlzZSA9IHRoaXMubG9hZFNldHRpbmdzRmlsZSgpO1xyXG5cdFx0bGV0IHRleHR1cmVGaWxlUHJvbWlzZSA9IHRoaXMubG9hZFRleHR1cmVzRmlsZSgpO1xyXG5cdFx0bGV0IG1hcmtlclVwZGF0ZVByb21pc2UgPSB0aGlzLm1hcmtlck1hbmFnZXIudXBkYXRlKCk7XHJcblxyXG5cdFx0dGhpcy5sb3dyZXNNYXRlcmlhbCA9IHRoaXMuY3JlYXRlTG93cmVzTWF0ZXJpYWwobG93cmVzVmVydGV4U2hhZGVyLCBsb3dyZXNGcmFnbWVudFNoYWRlciwgdW5pZm9ybXMpO1xyXG5cclxuXHRcdGxldCBzZXR0aW5nc1Byb21pc2UgPSBzZXR0aW5nc0ZpbGVQcm9taXNlXHJcblx0XHRcdC50aGVuKHdvcmxkU2V0dGluZ3MgPT4ge1xyXG5cdFx0XHRcdHRoaXMubmFtZSA9IHdvcmxkU2V0dGluZ3MubmFtZSA/IHdvcmxkU2V0dGluZ3MubmFtZSA6IHRoaXMubmFtZTtcclxuXHRcdFx0XHR0aGlzLndvcmxkID0gd29ybGRTZXR0aW5ncy53b3JsZCA/IHdvcmxkU2V0dGluZ3Mud29ybGQgOiB0aGlzLndvcmxkO1xyXG5cclxuXHRcdFx0XHR0aGlzLnN0YXJ0UG9zID0gey4uLnRoaXMuc3RhcnRQb3MsIC4uLndvcmxkU2V0dGluZ3Muc3RhcnRQb3N9O1xyXG5cdFx0XHRcdHRoaXMuc2t5Q29sb3IgPSB7Li4udGhpcy5za3lDb2xvciwgLi4ud29ybGRTZXR0aW5ncy5za3lDb2xvcn07XHJcblx0XHRcdFx0dGhpcy5hbWJpZW50TGlnaHQgPSB3b3JsZFNldHRpbmdzLmFtYmllbnRMaWdodCA/IHdvcmxkU2V0dGluZ3MuYW1iaWVudExpZ2h0IDogMDtcclxuXHJcblx0XHRcdFx0aWYgKHdvcmxkU2V0dGluZ3MuaGlyZXMgPT09IHVuZGVmaW5lZCkgd29ybGRTZXR0aW5ncy5oaXJlcyA9IHt9O1xyXG5cdFx0XHRcdGlmICh3b3JsZFNldHRpbmdzLmxvd3JlcyA9PT0gdW5kZWZpbmVkKSB3b3JsZFNldHRpbmdzLmxvd3JlcyA9IHt9O1xyXG5cclxuXHRcdFx0XHR0aGlzLmhpcmVzID0ge1xyXG5cdFx0XHRcdFx0dGlsZVNpemU6IHsuLi50aGlzLmhpcmVzLnRpbGVTaXplLCAuLi53b3JsZFNldHRpbmdzLmhpcmVzLnRpbGVTaXplfSxcclxuXHRcdFx0XHRcdHNjYWxlOiB7Li4udGhpcy5oaXJlcy5zY2FsZSwgLi4ud29ybGRTZXR0aW5ncy5oaXJlcy5zY2FsZX0sXHJcblx0XHRcdFx0XHR0cmFuc2xhdGU6IHsuLi50aGlzLmhpcmVzLnRyYW5zbGF0ZSwgLi4ud29ybGRTZXR0aW5ncy5oaXJlcy50cmFuc2xhdGV9XHJcblx0XHRcdFx0fTtcclxuXHRcdFx0XHR0aGlzLmxvd3JlcyA9IHtcclxuXHRcdFx0XHRcdHRpbGVTaXplOiB7Li4udGhpcy5sb3dyZXMudGlsZVNpemUsIC4uLndvcmxkU2V0dGluZ3MubG93cmVzLnRpbGVTaXplfSxcclxuXHRcdFx0XHRcdHNjYWxlOiB7Li4udGhpcy5sb3dyZXMuc2NhbGUsIC4uLndvcmxkU2V0dGluZ3MubG93cmVzLnNjYWxlfSxcclxuXHRcdFx0XHRcdHRyYW5zbGF0ZTogey4uLnRoaXMubG93cmVzLnRyYW5zbGF0ZSwgLi4ud29ybGRTZXR0aW5ncy5sb3dyZXMudHJhbnNsYXRlfVxyXG5cdFx0XHRcdH07XHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdGxldCBtYXBQcm9taXNlID0gUHJvbWlzZS5hbGwoW3NldHRpbmdzUHJvbWlzZSwgdGV4dHVyZUZpbGVQcm9taXNlXSlcclxuICAgICAgICAgICAgLnRoZW4odmFsdWVzID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCB0ZXh0dXJlcyA9IHZhbHVlc1sxXTtcclxuICAgICAgICAgICAgICAgIGlmICh0ZXh0dXJlcyA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwiRmFpbGVkIHRvIHBhcnNlIHRleHR1cmVzLmpzb24hXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuaGlyZXNNYXRlcmlhbCA9IHRoaXMuY3JlYXRlSGlyZXNNYXRlcmlhbChoaXJlc1ZlcnRleFNoYWRlciwgaGlyZXNGcmFnbWVudFNoYWRlciwgdW5pZm9ybXMsIHRleHR1cmVzKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmhpcmVzVGlsZU1hbmFnZXIgPSBuZXcgVGlsZU1hbmFnZXIodGhpcy5zY2VuZSwgbmV3IFRpbGVMb2FkZXIoYCR7dGhpcy5kYXRhVXJsfWhpcmVzL2AsIHRoaXMuaGlyZXNNYXRlcmlhbCwgdGhpcy5oaXJlcywgMSksIHRoaXMub25UaWxlTG9hZChcImhpcmVzXCIpLCB0aGlzLm9uVGlsZVVubG9hZChcImhpcmVzXCIpLCB0aGlzLmV2ZW50cyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvd3Jlc1RpbGVNYW5hZ2VyID0gbmV3IFRpbGVNYW5hZ2VyKHRoaXMuc2NlbmUsIG5ldyBUaWxlTG9hZGVyKGAke3RoaXMuZGF0YVVybH1sb3dyZXMvYCwgdGhpcy5sb3dyZXNNYXRlcmlhbCwgdGhpcy5sb3dyZXMsIDIpLCB0aGlzLm9uVGlsZUxvYWQoXCJsb3dyZXNcIiksIHRoaXMub25UaWxlVW5sb2FkKFwibG93cmVzXCIpLCB0aGlzLmV2ZW50cyk7XHJcblxyXG4gICAgICAgICAgICAgICAgYWxlcnQodGhpcy5ldmVudHMsIGBNYXAgJyR7dGhpcy5pZH0nIGlzIGxvYWRlZC5gLCBcImZpbmVcIik7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuXHRcdHJldHVybiBQcm9taXNlLmFsbChbbWFwUHJvbWlzZSwgbWFya2VyVXBkYXRlUHJvbWlzZV0pO1xyXG5cdH1cclxuXHJcblx0b25UaWxlTG9hZCA9IGxheWVyID0+IHRpbGUgPT4ge1xyXG5cdFx0ZGlzcGF0Y2hFdmVudCh0aGlzLmV2ZW50cywgXCJibHVlbWFwTWFwVGlsZUxvYWRlZFwiLCB7XHJcblx0XHRcdHRpbGU6IHRpbGUsXHJcblx0XHRcdGxheWVyOiBsYXllclxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRvblRpbGVVbmxvYWQgPSBsYXllciA9PiB0aWxlID0+IHtcclxuXHRcdGRpc3BhdGNoRXZlbnQodGhpcy5ldmVudHMsIFwiYmx1ZW1hcE1hcFRpbGVVbmxvYWRlZFwiLCB7XHJcblx0XHRcdHRpbGU6IHRpbGUsXHJcblx0XHRcdGxheWVyOiBsYXllclxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRsb2FkTWFwQXJlYSh4LCB6LCBoaXJlc1ZpZXdEaXN0YW5jZSwgbG93cmVzVmlld0Rpc3RhbmNlKSB7XHJcblx0XHRpZiAoIXRoaXMuaXNMb2FkZWQpIHJldHVybjtcclxuXHJcblx0XHRsZXQgaGlyZXNYID0gTWF0aC5mbG9vcigoeCAtIHRoaXMuaGlyZXMudHJhbnNsYXRlLngpIC8gdGhpcy5oaXJlcy50aWxlU2l6ZS54KTtcclxuXHRcdGxldCBoaXJlc1ogPSBNYXRoLmZsb29yKCh6IC0gdGhpcy5oaXJlcy50cmFuc2xhdGUueikgLyB0aGlzLmhpcmVzLnRpbGVTaXplLnopO1xyXG5cdFx0bGV0IGhpcmVzVmlld1ggPSBNYXRoLmZsb29yKGhpcmVzVmlld0Rpc3RhbmNlIC8gdGhpcy5oaXJlcy50aWxlU2l6ZS54KTtcclxuXHRcdGxldCBoaXJlc1ZpZXdaID0gTWF0aC5mbG9vcihoaXJlc1ZpZXdEaXN0YW5jZSAvIHRoaXMuaGlyZXMudGlsZVNpemUueik7XHJcblxyXG5cdFx0bGV0IGxvd3Jlc1ggPSBNYXRoLmZsb29yKCh4IC0gdGhpcy5sb3dyZXMudHJhbnNsYXRlLngpIC8gdGhpcy5sb3dyZXMudGlsZVNpemUueCk7XHJcblx0XHRsZXQgbG93cmVzWiA9IE1hdGguZmxvb3IoKHogLSB0aGlzLmxvd3Jlcy50cmFuc2xhdGUueikgLyB0aGlzLmxvd3Jlcy50aWxlU2l6ZS56KTtcclxuXHRcdGxldCBsb3dyZXNWaWV3WCA9IE1hdGguZmxvb3IobG93cmVzVmlld0Rpc3RhbmNlIC8gdGhpcy5sb3dyZXMudGlsZVNpemUueCk7XHJcblx0XHRsZXQgbG93cmVzVmlld1ogPSBNYXRoLmZsb29yKGxvd3Jlc1ZpZXdEaXN0YW5jZSAvIHRoaXMubG93cmVzLnRpbGVTaXplLnopO1xyXG5cclxuXHRcdHRoaXMuaGlyZXNUaWxlTWFuYWdlci5sb2FkQXJvdW5kVGlsZShoaXJlc1gsIGhpcmVzWiwgaGlyZXNWaWV3WCwgaGlyZXNWaWV3Wik7XHJcblx0XHR0aGlzLmxvd3Jlc1RpbGVNYW5hZ2VyLmxvYWRBcm91bmRUaWxlKGxvd3Jlc1gsIGxvd3Jlc1osIGxvd3Jlc1ZpZXdYLCBsb3dyZXNWaWV3Wik7XHJcblx0fVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTG9hZHMgdGhlIHNldHRpbmdzLmpzb24gZmlsZSBmb3IgdGhpcyBtYXBcclxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59XHJcbiAgICAgKi9cclxuICAgIGxvYWRTZXR0aW5nc0ZpbGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgYWxlcnQodGhpcy5ldmVudHMsIGBMb2FkaW5nIHNldHRpbmdzIGZvciBtYXAgJyR7dGhpcy5pZH0nLi4uYCwgXCJmaW5lXCIpO1xyXG5cclxuICAgICAgICAgICAgbGV0IGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCk7XHJcbiAgICAgICAgICAgIGxvYWRlci5zZXRSZXNwb25zZVR5cGUoXCJqc29uXCIpO1xyXG4gICAgICAgICAgICBsb2FkZXIubG9hZCh0aGlzLmRhdGFVcmwgKyBcIi4uL3NldHRpbmdzLmpzb25cIixcclxuICAgICAgICAgICAgICAgIHNldHRpbmdzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MubWFwcyAmJiBzZXR0aW5ncy5tYXBzW3RoaXMuaWRdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoc2V0dGluZ3MubWFwc1t0aGlzLmlkXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGB0aGUgc2V0dGluZ3MuanNvbiBkb2VzIG5vdCBjb250YWluIGluZm9ybWF0aW9ucyBmb3IgbWFwOiAke3RoaXMuaWR9YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICgpID0+IHt9LFxyXG4gICAgICAgICAgICAgICAgKCkgPT4gcmVqZWN0KGBGYWlsZWQgdG8gbG9hZCB0aGUgc2V0dGluZ3MuanNvbiBmb3IgbWFwOiAke3RoaXMuaWR9YClcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHQvKipcclxuXHQgKiBMb2FkcyB0aGUgdGV4dHVyZXMuanNvbiBmaWxlIGZvciB0aGlzIG1hcFxyXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59XHJcblx0ICovXHJcblx0bG9hZFRleHR1cmVzRmlsZSgpIHtcclxuXHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblx0XHRcdGFsZXJ0KHRoaXMuZXZlbnRzLCBgTG9hZGluZyB0ZXh0dXJlcyBmb3IgbWFwICcke3RoaXMuaWR9Jy4uLmAsIFwiZmluZVwiKTtcclxuXHJcblx0XHRcdGxldCBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlcigpO1xyXG5cdFx0XHRsb2FkZXIuc2V0UmVzcG9uc2VUeXBlKFwianNvblwiKTtcclxuXHRcdFx0bG9hZGVyLmxvYWQodGhpcy5kYXRhVXJsICsgXCIuLi90ZXh0dXJlcy5qc29uXCIsXHJcblx0XHRcdFx0cmVzb2x2ZSxcclxuXHRcdFx0XHQoKSA9PiB7fSxcclxuXHRcdFx0XHQoKSA9PiByZWplY3QoYEZhaWxlZCB0byBsb2FkIHRoZSB0ZXh0dXJlcy5qc29uIGZvciBtYXA6ICR7dGhpcy5pZH1gKVxyXG5cdFx0XHQpXHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgYSBoaXJlcyBNYXRlcmlhbCB3aXRoIHRoZSBnaXZlbiB0ZXh0dXJlc1xyXG5cdCAqIEBwYXJhbSB2ZXJ0ZXhTaGFkZXJcclxuXHQgKiBAcGFyYW0gZnJhZ21lbnRTaGFkZXJcclxuXHQgKiBAcGFyYW0gdW5pZm9ybXNcclxuXHQgKiBAcGFyYW0gdGV4dHVyZXMgdGhlIHRleHR1cmVzXHJcblx0ICogQHJldHVybnMge1NoYWRlck1hdGVyaWFsW119IHRoZSBoaXJlcyBNYXRlcmlhbCAoYXJyYXkgYmVjYXVzZSBpdHMgYSBtdWx0aS1tYXRlcmlhbClcclxuXHQgKi9cclxuXHRjcmVhdGVIaXJlc01hdGVyaWFsKHZlcnRleFNoYWRlciwgZnJhZ21lbnRTaGFkZXIsIHVuaWZvcm1zLCB0ZXh0dXJlcykge1xyXG5cdFx0bGV0IG1hdGVyaWFscyA9IFtdO1xyXG5cdFx0aWYgKCFBcnJheS5pc0FycmF5KHRleHR1cmVzLnRleHR1cmVzKSkgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCB0ZXh0dXJlLmpzb246ICd0ZXh0dXJlcycgaXMgbm90IGFuIGFycmF5IVwiKVxyXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0dXJlcy50ZXh0dXJlcy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRsZXQgdGV4dHVyZVNldHRpbmdzID0gdGV4dHVyZXMudGV4dHVyZXNbaV07XHJcblxyXG5cdFx0XHRsZXQgY29sb3IgPSB0ZXh0dXJlU2V0dGluZ3MuY29sb3I7XHJcblx0XHRcdGlmICghQXJyYXkuaXNBcnJheShjb2xvcikgfHwgY29sb3IubGVuZ3RoIDwgNCl7XHJcblx0XHRcdFx0Y29sb3IgPSBbMCwgMCwgMCwgMF07XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGxldCBvcGFxdWUgPSBjb2xvclszXSA9PT0gMTtcclxuXHRcdFx0bGV0IHRyYW5zcGFyZW50ID0gISF0ZXh0dXJlU2V0dGluZ3MudHJhbnNwYXJlbnQ7XHJcblxyXG5cdFx0XHRsZXQgdGV4dHVyZSA9IG5ldyBUZXh0dXJlKCk7XHJcblx0XHRcdHRleHR1cmUuaW1hZ2UgPSBzdHJpbmdUb0ltYWdlKHRleHR1cmVTZXR0aW5ncy50ZXh0dXJlKTtcclxuXHJcblx0XHRcdHRleHR1cmUuYW5pc290cm9weSA9IDE7XHJcblx0XHRcdHRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gb3BhcXVlIHx8IHRyYW5zcGFyZW50O1xyXG5cdFx0XHR0ZXh0dXJlLm1hZ0ZpbHRlciA9IE5lYXJlc3RGaWx0ZXI7XHJcblx0XHRcdHRleHR1cmUubWluRmlsdGVyID0gdGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPyBOZWFyZXN0TWlwTWFwTGluZWFyRmlsdGVyIDogTmVhcmVzdEZpbHRlcjtcclxuXHRcdFx0dGV4dHVyZS53cmFwUyA9IENsYW1wVG9FZGdlV3JhcHBpbmc7XHJcblx0XHRcdHRleHR1cmUud3JhcFQgPSBDbGFtcFRvRWRnZVdyYXBwaW5nO1xyXG5cdFx0XHR0ZXh0dXJlLmZsaXBZID0gZmFsc2U7XHJcblx0XHRcdHRleHR1cmUuZmxhdFNoYWRpbmcgPSB0cnVlO1xyXG5cdFx0XHR0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHRcdHRoaXMubG9hZGVkVGV4dHVyZXMucHVzaCh0ZXh0dXJlKTtcclxuXHJcblx0XHRcdGxldCBtYXRlcmlhbCA9IG5ldyBTaGFkZXJNYXRlcmlhbCh7XHJcblx0XHRcdFx0dW5pZm9ybXM6IHtcclxuXHRcdFx0XHRcdC4uLnVuaWZvcm1zLFxyXG5cdFx0XHRcdFx0dGV4dHVyZUltYWdlOiB7XHJcblx0XHRcdFx0XHRcdHR5cGU6ICd0JyxcclxuXHRcdFx0XHRcdFx0dmFsdWU6IHRleHR1cmVcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdHZlcnRleFNoYWRlcjogdmVydGV4U2hhZGVyLFxyXG5cdFx0XHRcdGZyYWdtZW50U2hhZGVyOiBmcmFnbWVudFNoYWRlcixcclxuXHRcdFx0XHR0cmFuc3BhcmVudDogdHJhbnNwYXJlbnQsXHJcblx0XHRcdFx0ZGVwdGhXcml0ZTogdHJ1ZSxcclxuXHRcdFx0XHRkZXB0aFRlc3Q6IHRydWUsXHJcblx0XHRcdFx0dmVydGV4Q29sb3JzOiBWZXJ0ZXhDb2xvcnMsXHJcblx0XHRcdFx0c2lkZTogRnJvbnRTaWRlLFxyXG5cdFx0XHRcdHdpcmVmcmFtZTogZmFsc2UsXHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0bWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cdFx0XHRtYXRlcmlhbHNbaV0gPSBtYXRlcmlhbDtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbWF0ZXJpYWxzO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyBhIGxvd3JlcyBNYXRlcmlhbFxyXG5cdCAqIEByZXR1cm5zIHtTaGFkZXJNYXRlcmlhbH0gdGhlIGhpcmVzIE1hdGVyaWFsXHJcblx0ICovXHJcblx0Y3JlYXRlTG93cmVzTWF0ZXJpYWwodmVydGV4U2hhZGVyLCBmcmFnbWVudFNoYWRlciwgdW5pZm9ybXMpIHtcclxuXHRcdHJldHVybiBuZXcgU2hhZGVyTWF0ZXJpYWwoe1xyXG5cdFx0XHR1bmlmb3JtczogdW5pZm9ybXMsXHJcblx0XHRcdHZlcnRleFNoYWRlcjogdmVydGV4U2hhZGVyLFxyXG5cdFx0XHRmcmFnbWVudFNoYWRlcjogZnJhZ21lbnRTaGFkZXIsXHJcblx0XHRcdHRyYW5zcGFyZW50OiBmYWxzZSxcclxuXHRcdFx0ZGVwdGhXcml0ZTogdHJ1ZSxcclxuXHRcdFx0ZGVwdGhUZXN0OiB0cnVlLFxyXG5cdFx0XHR2ZXJ0ZXhDb2xvcnM6IFZlcnRleENvbG9ycyxcclxuXHRcdFx0c2lkZTogRnJvbnRTaWRlLFxyXG5cdFx0XHR3aXJlZnJhbWU6IGZhbHNlXHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdHVubG9hZCgpIHtcclxuXHRcdGlmICh0aGlzLmhpcmVzVGlsZU1hbmFnZXIpIHRoaXMuaGlyZXNUaWxlTWFuYWdlci51bmxvYWQoKTtcclxuXHRcdHRoaXMuaGlyZXNUaWxlTWFuYWdlciA9IG51bGw7XHJcblxyXG5cdFx0aWYgKHRoaXMubG93cmVzVGlsZU1hbmFnZXIpIHRoaXMubG93cmVzVGlsZU1hbmFnZXIudW5sb2FkKCk7XHJcblx0XHR0aGlzLmxvd3Jlc1RpbGVNYW5hZ2VyID0gbnVsbDtcclxuXHJcblx0XHRpZiAodGhpcy5oaXJlc01hdGVyaWFsKSB0aGlzLmhpcmVzTWF0ZXJpYWwuZm9yRWFjaChtYXRlcmlhbCA9PiBtYXRlcmlhbC5kaXNwb3NlKCkpO1xyXG5cdFx0dGhpcy5oaXJlc01hdGVyaWFsID0gbnVsbDtcclxuXHJcblx0XHRpZiAodGhpcy5sb3dyZXNNYXRlcmlhbCkgdGhpcy5sb3dyZXNNYXRlcmlhbC5kaXNwb3NlKCk7XHJcblx0XHR0aGlzLmxvd3Jlc01hdGVyaWFsID0gbnVsbDtcclxuXHJcblx0XHR0aGlzLmxvYWRlZFRleHR1cmVzLmZvckVhY2godGV4dHVyZSA9PiB0ZXh0dXJlLmRpc3Bvc2UoKSk7XHJcblx0XHR0aGlzLmxvYWRlZFRleHR1cmVzID0gW107XHJcblxyXG5cdFx0dGhpcy5tYXJrZXJNYW5hZ2VyLmRpc3Bvc2UoKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJheS10cmFjZXMgYW5kIHJldHVybnMgdGhlIHRlcnJhaW4taGVpZ2h0IGF0IGEgc3BlY2lmaWMgbG9jYXRpb24sIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIG1hcC10aWxlIGxvYWRlZCBhdCB0aGF0IGxvY2F0aW9uXHJcblx0ICogQHBhcmFtIHhcclxuXHQgKiBAcGFyYW0gelxyXG5cdCAqIEByZXR1cm5zIHtib29sZWFufG51bWJlcn1cclxuXHQgKi9cclxuXHR0ZXJyYWluSGVpZ2h0QXQoeCwgeikge1xyXG5cdFx0aWYgKCF0aGlzLmlzTG9hZGVkKSByZXR1cm4gZmFsc2U7XHJcblxyXG5cdFx0dGhpcy5yYXljYXN0ZXIuc2V0KFxyXG5cdFx0XHRuZXcgVmVjdG9yMyh4LCAzMDAsIHopLCAvLyByYXktc3RhcnRcclxuXHRcdFx0bmV3IFZlY3RvcjMoMCwgLTEsIDApIC8vIHJheS1kaXJlY3Rpb25cclxuXHRcdCk7XHJcblx0XHR0aGlzLnJheWNhc3Rlci5uZWFyID0gMTtcclxuXHRcdHRoaXMucmF5Y2FzdGVyLmZhciA9IDMwMDtcclxuXHRcdHRoaXMucmF5Y2FzdGVyLmxheWVycy5lbmFibGVBbGwoKTtcclxuXHJcblx0XHRsZXQgaGlyZXNUaWxlSGFzaCA9IGhhc2hUaWxlKE1hdGguZmxvb3IoKHggLSB0aGlzLmhpcmVzLnRyYW5zbGF0ZS54KSAvIHRoaXMuaGlyZXMudGlsZVNpemUueCksIE1hdGguZmxvb3IoKHogLSB0aGlzLmhpcmVzLnRyYW5zbGF0ZS56KSAvIHRoaXMuaGlyZXMudGlsZVNpemUueikpO1xyXG5cdFx0bGV0IHRpbGUgPSB0aGlzLmhpcmVzVGlsZU1hbmFnZXIudGlsZXNbaGlyZXNUaWxlSGFzaF07XHJcblx0XHRpZiAoIXRpbGUgfHwgIXRpbGUubW9kZWwpIHtcclxuXHRcdFx0bGV0IGxvd3Jlc1RpbGVIYXNoID0gaGFzaFRpbGUoTWF0aC5mbG9vcigoeCAtIHRoaXMubG93cmVzLnRyYW5zbGF0ZS54KSAvIHRoaXMubG93cmVzLnRpbGVTaXplLngpLCBNYXRoLmZsb29yKCh6IC0gdGhpcy5sb3dyZXMudHJhbnNsYXRlLnopIC8gdGhpcy5sb3dyZXMudGlsZVNpemUueikpO1xyXG5cdFx0XHR0aWxlID0gdGhpcy5sb3dyZXNUaWxlTWFuYWdlci50aWxlc1tsb3dyZXNUaWxlSGFzaF07XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCF0aWxlIHx8ICF0aWxlLm1vZGVsKXtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRyeSB7XHJcblx0XHRcdGxldCBpbnRlcnNlY3RzID0gdGhpcy5yYXljYXN0ZXIuaW50ZXJzZWN0T2JqZWN0cyhbdGlsZS5tb2RlbF0pO1xyXG5cdFx0XHRpZiAoaW50ZXJzZWN0cy5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0cmV0dXJuIGludGVyc2VjdHNbMF0ucG9pbnQueTtcclxuXHRcdFx0fVxyXG5cdFx0fSBjYXRjaCAoZXJyKSB7XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGRpc3Bvc2UoKSB7XHJcblx0XHR0aGlzLnVubG9hZCgpO1xyXG5cdH1cclxuXHJcblx0Z2V0IGlzTG9hZGVkKCkge1xyXG5cdFx0cmV0dXJuICEhKHRoaXMuaGlyZXNNYXRlcmlhbCAmJiB0aGlzLmxvd3Jlc01hdGVyaWFsKTtcclxuXHR9XHJcblxyXG59XHJcbiIsImV4cG9ydCBjb25zdCBTS1lfRlJBR01FTlRfU0hBREVSID0gYFxyXG51bmlmb3JtIGZsb2F0IHN1bmxpZ2h0O1xyXG51bmlmb3JtIGZsb2F0IGFtYmllbnRMaWdodDtcclxudW5pZm9ybSB2ZWMzIHNreUNvbG9yO1xyXG5cclxudmFyeWluZyB2ZWMzIHZQb3NpdGlvbjtcclxuXHJcbnZvaWQgbWFpbigpIHtcclxuXHRmbG9hdCBob3Jpem9uV2lkdGggPSAwLjAwNTtcclxuXHRmbG9hdCBob3Jpem9uSGVpZ2h0ID0gMC4wO1xyXG5cdFxyXG5cdHZlYzQgY29sb3IgPSB2ZWM0KHNreUNvbG9yICogbWF4KHN1bmxpZ2h0LCBhbWJpZW50TGlnaHQpLCAxLjApO1xyXG5cdGZsb2F0IHZvaWRNdWx0aXBsaWVyID0gKGNsYW1wKHZQb3NpdGlvbi55IC0gaG9yaXpvbkhlaWdodCwgLWhvcml6b25XaWR0aCwgaG9yaXpvbldpZHRoKSArIGhvcml6b25XaWR0aCkgLyAoaG9yaXpvbldpZHRoICogMi4wKTtcclxuXHRjb2xvci5yZ2IgKj0gdm9pZE11bHRpcGxpZXI7XHJcblxyXG5cdGdsX0ZyYWdDb2xvciA9IGNvbG9yO1xyXG59XHJcbmA7XHJcbiIsImV4cG9ydCBjb25zdCBTS1lfVkVSVEVYX1NIQURFUiA9IGBcclxudmFyeWluZyB2ZWMzIHZQb3NpdGlvbjtcclxudm9pZCBtYWluKCkge1xyXG5cdHZQb3NpdGlvbiA9IHBvc2l0aW9uO1xyXG5cdFxyXG5cdGdsX1Bvc2l0aW9uID0gXHJcblx0XHRwcm9qZWN0aW9uTWF0cml4ICpcclxuXHRcdG1vZGVsVmlld01hdHJpeCAqXHJcblx0XHR2ZWM0KHBvc2l0aW9uLCAxKTtcclxufVxyXG5gO1xyXG4iLCJpbXBvcnQge1xyXG5cdFNjZW5lLFxyXG5cdFZlY3RvcjMsXHJcblx0TWVzaCxcclxuXHRTcGhlcmVHZW9tZXRyeSxcclxuXHRTaGFkZXJNYXRlcmlhbCxcclxuXHRCYWNrU2lkZVxyXG59IGZyb20gJ3RocmVlJztcclxuXHJcbmltcG9ydCB7IFNLWV9GUkFHTUVOVF9TSEFERVIgfSBmcm9tICcuL1NreUZyYWdtZW50U2hhZGVyJztcclxuaW1wb3J0IHsgU0tZX1ZFUlRFWF9TSEFERVIgfSBmcm9tICcuL1NreVZlcnRleFNoYWRlcic7XHJcblxyXG5leHBvcnQgY2xhc3MgU2t5Ym94U2NlbmUgZXh0ZW5kcyBTY2VuZSB7XHJcblxyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHR0aGlzLmF1dG9VcGRhdGUgPSBmYWxzZTtcclxuXHJcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdpc1NreWJveFNjZW5lJywgeyB2YWx1ZTogdHJ1ZSB9ICk7XHJcblxyXG5cdFx0dGhpcy5VTklGT1JNX3N1bmxpZ2h0ID0ge1xyXG5cdFx0XHR2YWx1ZTogMVxyXG5cdFx0fTtcclxuXHJcblx0XHR0aGlzLlVOSUZPUk1fc2t5Q29sb3IgPSB7XHJcblx0XHRcdHZhbHVlOiBuZXcgVmVjdG9yMygwLjUsIDAuNSwgMSlcclxuXHRcdH07XHJcblxyXG5cdFx0dGhpcy5VTklGT1JNX2FtYmllbnRMaWdodCA9IHtcclxuXHRcdFx0dmFsdWU6IDBcclxuXHRcdH07XHJcblxyXG5cdFx0bGV0IGdlb21ldHJ5ID0gbmV3IFNwaGVyZUdlb21ldHJ5KDEsIDQwLCA1KTtcclxuXHRcdGxldCBtYXRlcmlhbCA9IG5ldyBTaGFkZXJNYXRlcmlhbCh7XHJcblx0XHRcdHVuaWZvcm1zOiB7XHJcblx0XHRcdFx0c3VubGlnaHQ6IHRoaXMuVU5JRk9STV9zdW5saWdodCxcclxuXHRcdFx0XHRza3lDb2xvcjogdGhpcy5VTklGT1JNX3NreUNvbG9yLFxyXG5cdFx0XHRcdGFtYmllbnRMaWdodDogdGhpcy5VTklGT1JNX2FtYmllbnRMaWdodCxcclxuXHRcdFx0fSxcclxuXHRcdFx0dmVydGV4U2hhZGVyOiBTS1lfVkVSVEVYX1NIQURFUixcclxuXHRcdFx0ZnJhZ21lbnRTaGFkZXI6IFNLWV9GUkFHTUVOVF9TSEFERVIsXHJcblx0XHRcdHNpZGU6IEJhY2tTaWRlXHJcblx0XHR9KTtcclxuXHRcdGxldCBza3lib3ggPSBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpO1xyXG5cclxuXHRcdHRoaXMuYWRkKHNreWJveCk7XHJcblx0fVxyXG5cclxuXHRnZXQgc3VubGlnaHQoKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5VTklGT1JNX3N1bmxpZ2h0LnZhbHVlO1xyXG5cdH1cclxuXHJcblx0c2V0IHN1bmxpZ2h0KHN0cmVuZ3RoKSB7XHJcblx0XHR0aGlzLlVOSUZPUk1fc3VubGlnaHQudmFsdWUgPSBzdHJlbmd0aDtcclxuXHR9XHJcblxyXG5cdGdldCBza3lDb2xvcigpIHtcclxuXHRcdHJldHVybiB0aGlzLlVOSUZPUk1fc2t5Q29sb3IudmFsdWU7XHJcblx0fVxyXG5cclxuXHRzZXQgc2t5Q29sb3IoY29sb3IpIHtcclxuXHRcdHRoaXMuVU5JRk9STV9za3lDb2xvci52YWx1ZSA9IGNvbG9yO1xyXG5cdH1cclxuXHJcblx0Z2V0IGFtYmllbnRMaWdodCgpIHtcclxuXHRcdHJldHVybiB0aGlzLlVOSUZPUk1fYW1iaWVudExpZ2h0LnZhbHVlO1xyXG5cdH1cclxuXHJcblx0c2V0IGFtYmllbnRMaWdodChzdHJlbmd0aCkge1xyXG5cdFx0dGhpcy5VTklGT1JNX2FtYmllbnRMaWdodC52YWx1ZSA9IHN0cmVuZ3RoO1xyXG5cdH1cclxuXHJcbn0iLCJpbXBvcnQge01hdGhVdGlscywgVmVjdG9yM30gZnJvbSBcInRocmVlXCI7XHJcbmltcG9ydCB7ZGlzcGF0Y2hFdmVudH0gZnJvbSBcIi4uL3V0aWwvVXRpbHNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBDb250cm9sc01hbmFnZXIge1xyXG5cclxuXHRjb25zdHJ1Y3RvcihtYXBWaWV3ZXIsIGNhbWVyYSkge1xyXG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCAnaXNDb250cm9sc01hbmFnZXInLCB7IHZhbHVlOiB0cnVlIH0gKTtcclxuXHJcblx0XHR0aGlzLm1hcFZpZXdlciA9IG1hcFZpZXdlcjtcclxuXHRcdHRoaXMuY2FtZXJhID0gY2FtZXJhO1xyXG5cclxuXHRcdHRoaXMucG9zaXRpb25WYWx1ZSA9IG5ldyBWZWN0b3IzKDAsIDAsIDApO1xyXG5cclxuXHRcdHRoaXMucm90YXRpb25WYWx1ZSA9IDA7XHJcblx0XHR0aGlzLmFuZ2xlVmFsdWUgPSAwO1xyXG5cclxuXHRcdHRoaXMuZGlzdGFuY2VWYWx1ZSA9IDUwMDtcclxuXHJcblx0XHR0aGlzLm9ydGhvVmFsdWUgPSAwO1xyXG5cclxuXHRcdHRoaXMudmFsdWVDaGFuZ2VkID0gdHJ1ZTtcclxuXHRcdHRoaXMubGFzdE1hcFVwZGF0ZVBvc2l0aW9uID0gdGhpcy5wb3NpdGlvblZhbHVlLmNsb25lKCk7XHJcblxyXG5cdFx0dGhpcy5jb250cm9sc1ZhbHVlID0gbnVsbDtcclxuXHJcblx0XHR0aGlzLnVwZGF0ZUNhbWVyYSgpO1xyXG5cdH1cclxuXHJcblx0dXBkYXRlKGRlbHRhVGltZSwgbWFwKSB7XHJcblx0XHRpZiAoZGVsdGFUaW1lID4gNTApIGRlbHRhVGltZSA9IDUwOyAvLyBhc3N1bWUgbWluIDIwIFVQU1xyXG5cclxuXHRcdGlmICh0aGlzLmNvbnRyb2xzVmFsdWUgJiYgdHlwZW9mIHRoaXMuY29udHJvbHNWYWx1ZS51cGRhdGUgPT09IFwiZnVuY3Rpb25cIilcclxuXHRcdFx0dGhpcy5jb250cm9sc1ZhbHVlLnVwZGF0ZShkZWx0YVRpbWUsIG1hcCk7XHJcblx0fVxyXG5cclxuXHR1cGRhdGVDYW1lcmEoKSB7XHJcblx0XHRpZiAodGhpcy52YWx1ZUNoYW5nZWQpIHtcclxuXHRcdFx0Ly8gcHJldmVudCBwcm9ibGVtcyB3aXRoIHRoZSByb3RhdGlvbiB3aGVuIHRoZSBhbmdsZSBpcyAwICh0b3AtZG93bikgb3IgZGlzdGFuY2UgaXMgMCAoZmlyc3QtcGVyc29uKVxyXG5cdFx0XHRsZXQgcm90YXRhYmxlQW5nbGUgPSB0aGlzLmFuZ2xlVmFsdWU7XHJcblx0XHRcdGlmIChNYXRoLmFicyhyb3RhdGFibGVBbmdsZSkgPD0gMC4wMDAxKSByb3RhdGFibGVBbmdsZSA9IDAuMDAwMTtcclxuXHRcdFx0bGV0IHJvdGF0YWJsZURpc3RhbmNlID0gdGhpcy5kaXN0YW5jZVZhbHVlO1xyXG5cdFx0XHRpZiAoTWF0aC5hYnMocm90YXRhYmxlRGlzdGFuY2UpIDw9IDAuMDAwMSkgcm90YXRhYmxlRGlzdGFuY2UgPSAtMC4wMDAxO1xyXG5cclxuXHRcdFx0Ly8gZml4IGRpc3RhbmNlIGZvciBvcnRoby1lZmZlY3RcclxuXHRcdFx0aWYgKHRoaXMub3J0aG9WYWx1ZSA+IDApIHtcclxuXHRcdFx0XHRyb3RhdGFibGVEaXN0YW5jZSA9IE1hdGhVdGlscy5sZXJwKHJvdGF0YWJsZURpc3RhbmNlLCBNYXRoLm1heChyb3RhdGFibGVEaXN0YW5jZSwgMzAwKSwgTWF0aC5wb3codGhpcy5vcnRob1ZhbHVlLCA4KSk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIGNhbGN1bGF0ZSByb3RhdGlvblZlY3RvclxyXG5cdFx0XHRsZXQgcm90YXRpb25WZWN0b3IgPSBuZXcgVmVjdG9yMyhNYXRoLnNpbih0aGlzLnJvdGF0aW9uVmFsdWUpLCAwLCAtTWF0aC5jb3ModGhpcy5yb3RhdGlvblZhbHVlKSk7IC8vIDAgaXMgdG93YXJkcyBub3J0aFxyXG5cdFx0XHRsZXQgYW5nbGVSb3RhdGlvbkF4aXMgPSBuZXcgVmVjdG9yMygwLCAxLCAwKS5jcm9zcyhyb3RhdGlvblZlY3Rvcik7XHJcblx0XHRcdHJvdGF0aW9uVmVjdG9yLmFwcGx5QXhpc0FuZ2xlKGFuZ2xlUm90YXRpb25BeGlzLCAoTWF0aC5QSSAvIDIpIC0gcm90YXRhYmxlQW5nbGUpO1xyXG5cdFx0XHRyb3RhdGlvblZlY3Rvci5tdWx0aXBseVNjYWxhcihyb3RhdGFibGVEaXN0YW5jZSk7XHJcblxyXG5cdFx0XHQvLyBwb3NpdGlvbiBjYW1lcmFcclxuXHRcdFx0dGhpcy5jYW1lcmEucG9zaXRpb24uY29weSh0aGlzLnBvc2l0aW9uVmFsdWUpLnN1Yihyb3RhdGlvblZlY3Rvcik7XHJcblx0XHRcdHRoaXMuY2FtZXJhLmxvb2tBdCh0aGlzLnBvc2l0aW9uVmFsdWUpO1xyXG5cclxuXHRcdFx0Ly8gdXBkYXRlIG9ydGhvXHJcblx0XHRcdHRoaXMuY2FtZXJhLmRpc3RhbmNlID0gdGhpcy5kaXN0YW5jZVZhbHVlO1xyXG5cdFx0XHR0aGlzLmNhbWVyYS5vcnRobyA9IHRoaXMub3J0aG9WYWx1ZTtcclxuXHJcblx0XHRcdC8vIG9wdGltaXplIGZhci9uZWFyIHBsYW5lc1xyXG5cdFx0XHRpZiAodGhpcy5vcnRob1ZhbHVlIDw9IDApIHtcclxuXHRcdFx0XHRsZXQgbmVhciA9IE1hdGhVdGlscy5jbGFtcCh0aGlzLmRpc3RhbmNlVmFsdWUgLyAxMDAwLCAwLjAxLCAxKTtcclxuXHRcdFx0XHRsZXQgZmFyID0gTWF0aFV0aWxzLmNsYW1wKHRoaXMuZGlzdGFuY2VWYWx1ZSAqIDIsIE1hdGgubWF4KG5lYXIgKyAxLCAyMDAwKSwgdGhpcy5kaXN0YW5jZVZhbHVlICsgNTAwMCk7XHJcblx0XHRcdFx0aWYgKGZhciAtIG5lYXIgPiAxMDAwMCkgbmVhciA9IGZhciAtIDEwMDAwO1xyXG5cdFx0XHRcdHRoaXMuY2FtZXJhLm5lYXIgPSBuZWFyO1xyXG5cdFx0XHRcdHRoaXMuY2FtZXJhLmZhciA9IGZhcjtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR0aGlzLmNhbWVyYS5uZWFyID0gMTtcclxuXHRcdFx0XHR0aGlzLmNhbWVyYS5mYXIgPSByb3RhdGFibGVEaXN0YW5jZSArIDMwMDtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gZXZlbnRcclxuXHRcdFx0ZGlzcGF0Y2hFdmVudCh0aGlzLm1hcFZpZXdlci5ldmVudHMsIFwiYmx1ZW1hcENhbWVyYU1vdmVkXCIsIHtcclxuXHRcdFx0XHRjb250cm9sc01hbmFnZXI6IHRoaXMsXHJcblx0XHRcdFx0Y2FtZXJhOiB0aGlzLmNhbWVyYVxyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBpZiB0aGUgcG9zaXRpb24gY2hhbmdlZCwgdXBkYXRlIG1hcCB0byBzaG93IG5ldyBwb3NpdGlvblxyXG5cdFx0aWYgKHRoaXMubWFwVmlld2VyLm1hcCkge1xyXG5cdFx0XHRsZXQgdHJpZ2dlckRpc3RhbmNlID0gMTtcclxuXHRcdFx0aWYgKHRoaXMudmFsdWVDaGFuZ2VkKSB7XHJcblx0XHRcdFx0dHJpZ2dlckRpc3RhbmNlID0gdGhpcy5tYXBWaWV3ZXIubG9hZGVkSGlyZXNWaWV3RGlzdGFuY2UgKiAwLjg7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKFxyXG5cdFx0XHRcdE1hdGguYWJzKHRoaXMubGFzdE1hcFVwZGF0ZVBvc2l0aW9uLnggLSB0aGlzLnBvc2l0aW9uVmFsdWUueCkgPj0gdHJpZ2dlckRpc3RhbmNlIHx8XHJcblx0XHRcdFx0TWF0aC5hYnModGhpcy5sYXN0TWFwVXBkYXRlUG9zaXRpb24ueiAtIHRoaXMucG9zaXRpb25WYWx1ZS56KSA+PSB0cmlnZ2VyRGlzdGFuY2VcclxuXHRcdFx0KSB7XHJcblx0XHRcdFx0dGhpcy5sYXN0TWFwVXBkYXRlUG9zaXRpb24gPSB0aGlzLnBvc2l0aW9uVmFsdWUuY2xvbmUoKTtcclxuXHRcdFx0XHR0aGlzLm1hcFZpZXdlci5sb2FkTWFwQXJlYSh0aGlzLnBvc2l0aW9uVmFsdWUueCwgdGhpcy5wb3NpdGlvblZhbHVlLnopO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy52YWx1ZUNoYW5nZWQgPSBmYWxzZTtcclxuXHR9XHJcblxyXG5cdGhhbmRsZVZhbHVlQ2hhbmdlKCkge1xyXG5cdFx0dGhpcy52YWx1ZUNoYW5nZWQgPSB0cnVlO1xyXG5cdH1cclxuXHJcblx0Z2V0IHgoKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5wb3NpdGlvblZhbHVlLng7XHJcblx0fVxyXG5cclxuXHRzZXQgeCh4KSB7XHJcblx0XHR0aGlzLnBvc2l0aW9uVmFsdWUueCA9IHg7XHJcblx0XHR0aGlzLmhhbmRsZVZhbHVlQ2hhbmdlKCk7XHJcblx0fVxyXG5cclxuXHRnZXQgeSgpIHtcclxuXHRcdHJldHVybiB0aGlzLnBvc2l0aW9uVmFsdWUueTtcclxuXHR9XHJcblxyXG5cdHNldCB5KHkpIHtcclxuXHRcdHRoaXMucG9zaXRpb25WYWx1ZS55ID0geTtcclxuXHRcdHRoaXMuaGFuZGxlVmFsdWVDaGFuZ2UoKTtcclxuXHR9XHJcblxyXG5cdGdldCB6KCkge1xyXG5cdFx0cmV0dXJuIHRoaXMucG9zaXRpb25WYWx1ZS56O1xyXG5cdH1cclxuXHJcblx0c2V0IHooeikge1xyXG5cdFx0dGhpcy5wb3NpdGlvblZhbHVlLnogPSB6O1xyXG5cdFx0dGhpcy5oYW5kbGVWYWx1ZUNoYW5nZSgpO1xyXG5cdH1cclxuXHJcblx0Z2V0IHBvc2l0aW9uKCkge1xyXG5cdFx0cmV0dXJuIHRoaXMucG9zaXRpb25WYWx1ZTtcclxuXHR9XHJcblxyXG5cdHNldCBwb3NpdGlvbihwb3NpdGlvbikge1xyXG5cdFx0dGhpcy5wb3NpdGlvbi5jb3B5KHBvc2l0aW9uKTtcclxuXHRcdHRoaXMuaGFuZGxlVmFsdWVDaGFuZ2UoKTtcclxuXHR9XHJcblxyXG5cdGdldCByb3RhdGlvbigpIHtcclxuXHRcdHJldHVybiB0aGlzLnJvdGF0aW9uVmFsdWU7XHJcblx0fVxyXG5cclxuXHRzZXQgcm90YXRpb24ocm90YXRpb24pIHtcclxuXHRcdHRoaXMucm90YXRpb25WYWx1ZSA9IHJvdGF0aW9uO1xyXG5cdFx0dGhpcy5oYW5kbGVWYWx1ZUNoYW5nZSgpO1xyXG5cdH1cclxuXHJcblx0Z2V0IGFuZ2xlKCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuYW5nbGVWYWx1ZTtcclxuXHR9XHJcblxyXG5cdHNldCBhbmdsZShhbmdsZSkge1xyXG5cdFx0dGhpcy5hbmdsZVZhbHVlID0gYW5nbGU7XHJcblx0XHR0aGlzLmhhbmRsZVZhbHVlQ2hhbmdlKCk7XHJcblx0fVxyXG5cclxuXHRnZXQgZGlzdGFuY2UoKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5kaXN0YW5jZVZhbHVlO1xyXG5cdH1cclxuXHJcblx0c2V0IGRpc3RhbmNlKGRpc3RhbmNlKSB7XHJcblx0XHR0aGlzLmRpc3RhbmNlVmFsdWUgPSBkaXN0YW5jZTtcclxuXHRcdHRoaXMuaGFuZGxlVmFsdWVDaGFuZ2UoKTtcclxuXHR9XHJcblxyXG5cdGdldCBvcnRobygpIHtcclxuXHRcdHJldHVybiB0aGlzLm9ydGhvVmFsdWU7XHJcblx0fVxyXG5cclxuXHRzZXQgb3J0aG8ob3J0aG8pIHtcclxuXHRcdHRoaXMub3J0aG9WYWx1ZSA9IG9ydGhvO1xyXG5cdFx0dGhpcy5oYW5kbGVWYWx1ZUNoYW5nZSgpO1xyXG5cdH1cclxuXHJcblx0c2V0IGNvbnRyb2xzKGNvbnRyb2xzKSB7XHJcblx0XHRpZiAodGhpcy5jb250cm9sc1ZhbHVlICYmIHR5cGVvZiB0aGlzLmNvbnRyb2xzVmFsdWUuc3RvcCA9PT0gXCJmdW5jdGlvblwiKVxyXG5cdFx0XHR0aGlzLmNvbnRyb2xzVmFsdWUuc3RvcCgpO1xyXG5cclxuXHRcdHRoaXMuY29udHJvbHNWYWx1ZSA9IGNvbnRyb2xzO1xyXG5cclxuXHRcdGlmICh0aGlzLmNvbnRyb2xzVmFsdWUgJiYgdHlwZW9mIHRoaXMuY29udHJvbHNWYWx1ZS5zdGFydCA9PT0gXCJmdW5jdGlvblwiKVxyXG5cdFx0XHR0aGlzLmNvbnRyb2xzVmFsdWUuc3RhcnQodGhpcyk7XHJcblx0fVxyXG5cclxuXHRnZXQgY29udHJvbHMoKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5jb250cm9sc1ZhbHVlO1xyXG5cdH1cclxuXHJcbn0iLCJpbXBvcnQge01hdGhVdGlscywgTU9VU0UsIFZlY3RvcjIsIFZlY3RvcjN9IGZyb20gXCJ0aHJlZVwiO1xyXG5pbXBvcnQge2FsZXJ0fSBmcm9tIFwiLi4vdXRpbC9VdGlsc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE1hcENvbnRyb2xzIHtcclxuXHJcbiAgICBzdGF0aWMgU1RBVEVTID0ge1xyXG4gICAgICAgIE5PTkU6IDAsXHJcbiAgICAgICAgTU9WRTogMSxcclxuICAgICAgICBPUkJJVDogMlxyXG4gICAgfTtcclxuXHJcbiAgICBzdGF0aWMgS0VZUyA9IHtcclxuICAgICAgICBMRUZUOiBbXCJBcnJvd0xlZnRcIiwgXCJhXCIsIFwiQVwiLCAzNywgNjVdLFxyXG4gICAgICAgIFVQOiBbXCJBcnJvd1VwXCIsIFwid1wiLCBcIldcIiwgMzgsIDg3XSxcclxuICAgICAgICBSSUdIVDogW1wiQXJyb3dSaWdodFwiLCBcImRcIiwgXCJEXCIsIDM5LCA2OF0sXHJcbiAgICAgICAgRE9XTjogW1wiQXJyb3dEb3duXCIsIFwic1wiLCBcIlNcIiwgNDAsIDgzXSxcclxuICAgICAgICBaT09NX0lOOiBbXCIrXCJdLFxyXG4gICAgICAgIFpPT01fT1VUOiBbXCItXCJdXHJcbiAgICB9O1xyXG5cclxuICAgIHN0YXRpYyBCVVRUT05TID0ge1xyXG4gICAgICAgIE9SQklUOiBbTU9VU0UuUklHSFRdLFxyXG4gICAgICAgIE1PVkU6IFtNT1VTRS5MRUZUXVxyXG4gICAgfTtcclxuXHJcbiAgICBzdGF0aWMgVkVDVE9SMl9aRVJPID0gbmV3IFZlY3RvcjIoMCwgMCk7XHJcblxyXG4gICAgY29uc3RydWN0b3Iocm9vdEVsZW1lbnQsIGhhbW1lckxpYiwgZXZlbnRzID0gbnVsbCkge1xyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ2lzTWFwQ29udHJvbHMnLCB7IHZhbHVlOiB0cnVlIH0gKTtcclxuXHJcbiAgICAgICAgdGhpcy5yb290RWxlbWVudCA9IHJvb3RFbGVtZW50O1xyXG4gICAgICAgIHRoaXMuaGFtbWVyID0gaGFtbWVyTGliO1xyXG4gICAgICAgIHRoaXMuZXZlbnRzID0gZXZlbnRzO1xyXG5cclxuICAgICAgICB0aGlzLmNvbnRyb2xzID0gbnVsbDtcclxuXHJcbiAgICAgICAgdGhpcy50YXJnZXRQb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7XHJcbiAgICAgICAgdGhpcy5wb3NpdGlvblRlcnJhaW5IZWlnaHQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy50YXJnZXREaXN0YW5jZSA9IDQwMDtcclxuICAgICAgICB0aGlzLm1pbkRpc3RhbmNlID0gMTA7XHJcbiAgICAgICAgdGhpcy5tYXhEaXN0YW5jZSA9IDEwMDAwO1xyXG5cclxuICAgICAgICB0aGlzLnRhcmdldFJvdGF0aW9uID0gMDtcclxuXHJcbiAgICAgICAgdGhpcy50YXJnZXRBbmdsZSA9IDA7XHJcbiAgICAgICAgdGhpcy5taW5BbmdsZSA9IDA7XHJcbiAgICAgICAgdGhpcy5tYXhBbmdsZSA9IE1hdGguUEkgLyAyO1xyXG4gICAgICAgIHRoaXMubWF4QW5nbGVGb3Jab29tID0gdGhpcy5tYXhBbmdsZTtcclxuXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IE1hcENvbnRyb2xzLlNUQVRFUy5OT05FO1xyXG4gICAgICAgIHRoaXMubW91c2UgPSBuZXcgVmVjdG9yMigpO1xyXG4gICAgICAgIHRoaXMubGFzdE1vdXNlID0gbmV3IFZlY3RvcjIoKTtcclxuICAgICAgICB0aGlzLmtleVN0YXRlcyA9IHt9O1xyXG4gICAgICAgIHRoaXMudG91Y2hTdGFydCA9IG5ldyBWZWN0b3IyKCk7XHJcbiAgICAgICAgdGhpcy50b3VjaFRpbHRTdGFydCA9IDA7XHJcbiAgICAgICAgdGhpcy5sYXN0VG91Y2hSb3RhdGlvbiA9IDA7XHJcbiAgICAgICAgdGhpcy50b3VjaFpvb21TdGFydCA9IDA7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0KGNvbnRyb2xzKSB7XHJcbiAgICAgICAgdGhpcy5jb250cm9scyA9IGNvbnRyb2xzO1xyXG5cclxuICAgICAgICB0aGlzLnRhcmdldFBvc2l0aW9uLmNvcHkodGhpcy5jb250cm9scy5wb3NpdGlvbik7XHJcbiAgICAgICAgdGhpcy5wb3NpdGlvblRlcnJhaW5IZWlnaHQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy50YXJnZXREaXN0YW5jZSA9IHRoaXMuY29udHJvbHMuZGlzdGFuY2U7XHJcbiAgICAgICAgdGhpcy50YXJnZXREaXN0YW5jZSA9IE1hdGhVdGlscy5jbGFtcCh0aGlzLnRhcmdldERpc3RhbmNlLCB0aGlzLm1pbkRpc3RhbmNlLCB0aGlzLm1heERpc3RhbmNlKTtcclxuXHJcbiAgICAgICAgdGhpcy50YXJnZXRSb3RhdGlvbiA9IHRoaXMuY29udHJvbHMucm90YXRpb247XHJcblxyXG4gICAgICAgIHRoaXMudGFyZ2V0QW5nbGUgPSB0aGlzLmNvbnRyb2xzLmFuZ2xlO1xyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZVpvb20oKTtcclxuXHJcbiAgICAgICAgLy8gYWRkIGV2ZW50c1xyXG4gICAgICAgIHRoaXMucm9vdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIndoZWVsXCIsIHRoaXMub25XaGVlbCwge3Bhc3NpdmU6IHRydWV9KVxyXG4gICAgICAgIHRoaXMuaGFtbWVyLm9uKCd6b29tc3RhcnQnLCB0aGlzLm9uVG91Y2hab29tRG93bik7XHJcbiAgICAgICAgdGhpcy5oYW1tZXIub24oJ3pvb21tb3ZlJywgdGhpcy5vblRvdWNoWm9vbU1vdmUpO1xyXG4gICAgICAgIHRoaXMucm9vdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5vbk1vdXNlRG93bik7XHJcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMub25Nb3VzZU1vdmUpO1xyXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5vbk1vdXNlVXApO1xyXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5vbktleURvd24pO1xyXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMub25LZXlVcCk7XHJcbiAgICAgICAgdGhpcy5oYW1tZXIub24oJ21vdmVzdGFydCcsIHRoaXMub25Ub3VjaERvd24pO1xyXG4gICAgICAgIHRoaXMuaGFtbWVyLm9uKCdtb3ZlbW92ZScsIHRoaXMub25Ub3VjaE1vdmUpO1xyXG4gICAgICAgIHRoaXMuaGFtbWVyLm9uKCdtb3ZlZW5kJywgdGhpcy5vblRvdWNoVXApO1xyXG4gICAgICAgIHRoaXMuaGFtbWVyLm9uKCdtb3ZlY2FuY2VsJywgdGhpcy5vblRvdWNoVXApO1xyXG4gICAgICAgIHRoaXMuaGFtbWVyLm9uKCd0aWx0c3RhcnQnLCB0aGlzLm9uVG91Y2hUaWx0RG93bik7XHJcbiAgICAgICAgdGhpcy5oYW1tZXIub24oJ3RpbHRtb3ZlJywgdGhpcy5vblRvdWNoVGlsdE1vdmUpO1xyXG4gICAgICAgIHRoaXMuaGFtbWVyLm9uKCd0aWx0ZW5kJywgdGhpcy5vblRvdWNoVGlsdFVwKTtcclxuICAgICAgICB0aGlzLmhhbW1lci5vbigndGlsdGNhbmNlbCcsIHRoaXMub25Ub3VjaFRpbHRVcCk7XHJcbiAgICAgICAgdGhpcy5oYW1tZXIub24oJ3JvdGF0ZXN0YXJ0JywgdGhpcy5vblRvdWNoUm90YXRlRG93bik7XHJcbiAgICAgICAgdGhpcy5oYW1tZXIub24oJ3JvdGF0ZW1vdmUnLCB0aGlzLm9uVG91Y2hSb3RhdGVNb3ZlKTtcclxuICAgICAgICB0aGlzLmhhbW1lci5vbigncm90YXRlZW5kJywgdGhpcy5vblRvdWNoUm90YXRlVXApO1xyXG4gICAgICAgIHRoaXMuaGFtbWVyLm9uKCdyb3RhdGVjYW5jZWwnLCB0aGlzLm9uVG91Y2hSb3RhdGVVcCk7XHJcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgdGhpcy5vbkNvbnRleHRNZW51KTtcclxuICAgIH1cclxuXHJcbiAgICBzdG9wKCkge1xyXG4gICAgICAgIC8vIHJlbW92ZSBldmVudHNcclxuICAgICAgICB0aGlzLnJvb3RFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ3aGVlbFwiLCB0aGlzLm9uV2hlZWwpXHJcbiAgICAgICAgdGhpcy5oYW1tZXIub2ZmKCd6b29tc3RhcnQnLCB0aGlzLm9uVG91Y2hab29tRG93bik7XHJcbiAgICAgICAgdGhpcy5oYW1tZXIub2ZmKCd6b29tbW92ZScsIHRoaXMub25Ub3VjaFpvb21Nb3ZlKTtcclxuICAgICAgICB0aGlzLnJvb3RFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMub25Nb3VzZURvd24pO1xyXG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uTW91c2VNb3ZlKTtcclxuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMub25Nb3VzZVVwKTtcclxuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMub25LZXlEb3duKTtcclxuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLm9uS2V5VXApO1xyXG4gICAgICAgIHRoaXMuaGFtbWVyLm9uKCdtb3Zlc3RhcnQnLCB0aGlzLm9uVG91Y2hEb3duKTtcclxuICAgICAgICB0aGlzLmhhbW1lci5vZmYoJ21vdmVtb3ZlJywgdGhpcy5vblRvdWNoTW92ZSk7XHJcbiAgICAgICAgdGhpcy5oYW1tZXIub2ZmKCdtb3ZlZW5kJywgdGhpcy5vblRvdWNoVXApO1xyXG4gICAgICAgIHRoaXMuaGFtbWVyLm9mZignbW92ZWNhbmNlbCcsIHRoaXMub25Ub3VjaFVwKTtcclxuICAgICAgICB0aGlzLmhhbW1lci5vZmYoJ3RpbHRzdGFydCcsIHRoaXMub25Ub3VjaFRpbHREb3duKTtcclxuICAgICAgICB0aGlzLmhhbW1lci5vZmYoJ3RpbHRtb3ZlJywgdGhpcy5vblRvdWNoVGlsdE1vdmUpO1xyXG4gICAgICAgIHRoaXMuaGFtbWVyLm9mZigndGlsdGVuZCcsIHRoaXMub25Ub3VjaFRpbHRVcCk7XHJcbiAgICAgICAgdGhpcy5oYW1tZXIub2ZmKCd0aWx0Y2FuY2VsJywgdGhpcy5vblRvdWNoVGlsdFVwKTtcclxuICAgICAgICB0aGlzLmhhbW1lci5vZmYoJ3JvdGF0ZXN0YXJ0JywgdGhpcy5vblRvdWNoUm90YXRlRG93bik7XHJcbiAgICAgICAgdGhpcy5oYW1tZXIub2ZmKCdyb3RhdGVtb3ZlJywgdGhpcy5vblRvdWNoUm90YXRlTW92ZSk7XHJcbiAgICAgICAgdGhpcy5oYW1tZXIub2ZmKCdyb3RhdGVlbmQnLCB0aGlzLm9uVG91Y2hSb3RhdGVVcCk7XHJcbiAgICAgICAgdGhpcy5oYW1tZXIub2ZmKCdyb3RhdGVjYW5jZWwnLCB0aGlzLm9uVG91Y2hSb3RhdGVVcCk7XHJcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgdGhpcy5vbkNvbnRleHRNZW51KTtcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGUoZGVsdGFUaW1lLCBtYXApIHtcclxuICAgICAgICAvLyA9PSBwcm9jZXNzIG1vdXNlIG1vdmVtZW50cyA9PVxyXG4gICAgICAgIGxldCBkZWx0YU1vdXNlID0gdGhpcy5sYXN0TW91c2UuY2xvbmUoKS5zdWIodGhpcy5tb3VzZSk7XHJcbiAgICAgICAgbGV0IG1vdmVEZWx0YSA9IG5ldyBWZWN0b3IyKCk7XHJcblxyXG4gICAgICAgIC8vIHpvb20ga2V5c1xyXG4gICAgICAgIGlmICh0aGlzLmtleVN0YXRlcy5aT09NX0lOKSB7XHJcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0RGlzdGFuY2UgKj0gMSAtIDAuMDAzICogZGVsdGFUaW1lO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVpvb20oKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMua2V5U3RhdGVzLlpPT01fT1VUKXtcclxuICAgICAgICAgICAgdGhpcy50YXJnZXREaXN0YW5jZSAqPSAxICsgMC4wMDMgKiBkZWx0YVRpbWU7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlWm9vbSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gbW92ZVxyXG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09PSBNYXBDb250cm9scy5TVEFURVMuTU9WRSkge1xyXG4gICAgICAgICAgICBtb3ZlRGVsdGEuY29weShkZWx0YU1vdXNlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5rZXlTdGF0ZXMuVVApIG1vdmVEZWx0YS55IC09IDIwO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5rZXlTdGF0ZXMuRE9XTikgbW92ZURlbHRhLnkgKz0gMjA7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmtleVN0YXRlcy5MRUZUKSBtb3ZlRGVsdGEueCAtPSAyMDtcclxuICAgICAgICAgICAgaWYgKHRoaXMua2V5U3RhdGVzLlJJR0hUKSBtb3ZlRGVsdGEueCArPSAyMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChtb3ZlRGVsdGEueCAhPT0gMCB8fCBtb3ZlRGVsdGEueSAhPT0gMCkge1xyXG4gICAgICAgICAgICBtb3ZlRGVsdGEucm90YXRlQXJvdW5kKE1hcENvbnRyb2xzLlZFQ1RPUjJfWkVSTywgdGhpcy5jb250cm9scy5yb3RhdGlvbik7XHJcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0UG9zaXRpb24uc2V0KFxyXG4gICAgICAgICAgICAgICAgdGhpcy50YXJnZXRQb3NpdGlvbi54ICsgKG1vdmVEZWx0YS54ICogdGhpcy50YXJnZXREaXN0YW5jZSAvIHRoaXMucm9vdEVsZW1lbnQuY2xpZW50SGVpZ2h0ICogMS41KSxcclxuICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0UG9zaXRpb24ueSxcclxuICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0UG9zaXRpb24ueiArIChtb3ZlRGVsdGEueSAqIHRoaXMudGFyZ2V0RGlzdGFuY2UgLyB0aGlzLnJvb3RFbGVtZW50LmNsaWVudEhlaWdodCAqIDEuNSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVQb3NpdGlvblRlcnJhaW5IZWlnaHQobWFwKTtcclxuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLnBvc2l0aW9uVGVycmFpbkhlaWdodCkge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVBvc2l0aW9uVGVycmFpbkhlaWdodChtYXApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gdGlsdC9wYW5cclxuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gTWFwQ29udHJvbHMuU1RBVEVTLk9SQklUKSB7XHJcbiAgICAgICAgICAgIGlmIChkZWx0YU1vdXNlLnggIT09IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0Um90YXRpb24gLT0gKGRlbHRhTW91c2UueCAvIHRoaXMucm9vdEVsZW1lbnQuY2xpZW50SGVpZ2h0ICogTWF0aC5QSSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLndyYXBSb3RhdGlvbigpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoZGVsdGFNb3VzZS55ICE9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldEFuZ2xlICs9IChkZWx0YU1vdXNlLnkgLyB0aGlzLnJvb3RFbGVtZW50LmNsaWVudEhlaWdodCAqIE1hdGguUEkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy50YXJnZXRBbmdsZSA9IE1hdGhVdGlscy5jbGFtcCh0aGlzLnRhcmdldEFuZ2xlLCB0aGlzLm1pbkFuZ2xlLCB0aGlzLm1heEFuZ2xlRm9yWm9vbSArIDAuMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMudGFyZ2V0QW5nbGUgPiB0aGlzLm1heEFuZ2xlRm9yWm9vbSkgdGhpcy50YXJnZXRBbmdsZSAtPSAodGhpcy50YXJnZXRBbmdsZSAtIHRoaXMubWF4QW5nbGVGb3Jab29tKSAqIDAuMztcclxuXHJcbiAgICAgICAgLy8gPT0gU21vb3RobHkgYXBwbHkgdGFyZ2V0IHZhbHVlcyA9PVxyXG4gICAgICAgIGxldCBzb21ldGhpbmdDaGFuZ2VkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8vIG1vdmVcclxuICAgICAgICBsZXQgZGVsdGFQb3NpdGlvbiA9IHRoaXMudGFyZ2V0UG9zaXRpb24uY2xvbmUoKS5zdWIodGhpcy5jb250cm9scy5wb3NpdGlvbik7XHJcbiAgICAgICAgaWYgKE1hdGguYWJzKGRlbHRhUG9zaXRpb24ueCkgPiAwLjAxIHx8IE1hdGguYWJzKGRlbHRhUG9zaXRpb24ueSkgPiAwLjAwMSB8fCBNYXRoLmFicyhkZWx0YVBvc2l0aW9uLnopID4gMC4wMSkge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xzLnBvc2l0aW9uID0gdGhpcy5jb250cm9scy5wb3NpdGlvbi5hZGQoZGVsdGFQb3NpdGlvbi5tdWx0aXBseVNjYWxhcigwLjAxNSAqIGRlbHRhVGltZSkpO1xyXG4gICAgICAgICAgICBzb21ldGhpbmdDaGFuZ2VkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHJvdGF0aW9uXHJcbiAgICAgICAgbGV0IGRlbHRhUm90YXRpb24gPSB0aGlzLnRhcmdldFJvdGF0aW9uIC0gdGhpcy5jb250cm9scy5yb3RhdGlvbjtcclxuICAgICAgICBpZiAoTWF0aC5hYnMoZGVsdGFSb3RhdGlvbikgPiAwLjAwMDEpIHtcclxuICAgICAgICAgICAgdGhpcy5jb250cm9scy5yb3RhdGlvbiArPSBkZWx0YVJvdGF0aW9uICogMC4wMTUgKiBkZWx0YVRpbWU7XHJcbiAgICAgICAgICAgIHNvbWV0aGluZ0NoYW5nZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gYW5nbGVcclxuICAgICAgICBsZXQgZGVsdGFBbmdsZSA9IHRoaXMudGFyZ2V0QW5nbGUgLSB0aGlzLmNvbnRyb2xzLmFuZ2xlO1xyXG4gICAgICAgIGlmIChNYXRoLmFicyhkZWx0YUFuZ2xlKSA+IDAuMDAwMSkge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xzLmFuZ2xlICs9IGRlbHRhQW5nbGUgKiAwLjAxNSAqIGRlbHRhVGltZTtcclxuICAgICAgICAgICAgc29tZXRoaW5nQ2hhbmdlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyB6b29tXHJcbiAgICAgICAgbGV0IGRlbHRhRGlzdGFuY2UgPSB0aGlzLnRhcmdldERpc3RhbmNlIC0gdGhpcy5jb250cm9scy5kaXN0YW5jZVxyXG4gICAgICAgIGlmIChNYXRoLmFicyhkZWx0YURpc3RhbmNlKSA+IDAuMDAxKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29udHJvbHMuZGlzdGFuY2UgKz0gZGVsdGFEaXN0YW5jZSAqIDAuMDEgKiBkZWx0YVRpbWU7XHJcbiAgICAgICAgICAgIHNvbWV0aGluZ0NoYW5nZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gPT0gQWRqdXN0IGNhbWVyYSBoZWlnaHQgdG8gdGVycmFpbiA9PVxyXG4gICAgICAgIGlmIChzb21ldGhpbmdDaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgIGxldCB5ID0gMDtcclxuICAgICAgICAgICAgaWYgKHRoaXMucG9zaXRpb25UZXJyYWluSGVpZ2h0ICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgeSA9IHRoaXMudGFyZ2V0UG9zaXRpb24ueTtcclxuICAgICAgICAgICAgICAgIGxldCBkZWx0YVkgPSB0aGlzLnBvc2l0aW9uVGVycmFpbkhlaWdodCAtIHk7XHJcbiAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMoZGVsdGFZKSA+IDAuMDAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgeSArPSBkZWx0YVkgKiAwLjAxICogZGVsdGFUaW1lO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBtaW5DYW1lcmFIZWlnaHQgPSBtYXAudGVycmFpbkhlaWdodEF0KHRoaXMuY29udHJvbHMuY2FtZXJhLnBvc2l0aW9uLngsIHRoaXMuY29udHJvbHMuY2FtZXJhLnBvc2l0aW9uLnopICsgKCh0aGlzLm1pbkRpc3RhbmNlIC0gdGhpcy50YXJnZXREaXN0YW5jZSkgKiAwLjQpICsgMTtcclxuICAgICAgICAgICAgaWYgKG1pbkNhbWVyYUhlaWdodCA+IHkpIHkgPSBtaW5DYW1lcmFIZWlnaHQ7XHJcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0UG9zaXRpb24ueSA9IHk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyA9PSBGaXggTmFOJ3MgYXMgYSBmYWlsLXNhZmUgPT1cclxuICAgICAgICBpZiAoaXNOYU4odGhpcy50YXJnZXRQb3NpdGlvbi54KSl7XHJcbiAgICAgICAgICAgIGFsZXJ0KHRoaXMuZXZlbnRzLCBgSW52YWxpZCB0YXJnZXRQb3NpdGlvbiB4OiAke3RoaXMudGFyZ2V0UG9zaXRpb24ueH1gLCBcIndhcm5pbmdcIik7XHJcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0UG9zaXRpb24ueCA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpc05hTih0aGlzLnRhcmdldFBvc2l0aW9uLnkpKXtcclxuICAgICAgICAgICAgYWxlcnQodGhpcy5ldmVudHMsIGBJbnZhbGlkIHRhcmdldFBvc2l0aW9uIHk6ICR7dGhpcy50YXJnZXRQb3NpdGlvbi55fWAsIFwid2FybmluZ1wiKTtcclxuICAgICAgICAgICAgdGhpcy50YXJnZXRQb3NpdGlvbi55ID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlzTmFOKHRoaXMudGFyZ2V0UG9zaXRpb24ueikpe1xyXG4gICAgICAgICAgICBhbGVydCh0aGlzLmV2ZW50cywgYEludmFsaWQgdGFyZ2V0UG9zaXRpb24gejogJHt0aGlzLnRhcmdldFBvc2l0aW9uLnp9YCwgXCJ3YXJuaW5nXCIpO1xyXG4gICAgICAgICAgICB0aGlzLnRhcmdldFBvc2l0aW9uLnogPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaXNOYU4odGhpcy50YXJnZXREaXN0YW5jZSkpe1xyXG4gICAgICAgICAgICBhbGVydCh0aGlzLmV2ZW50cywgYEludmFsaWQgdGFyZ2V0RGlzdGFuY2U6ICR7dGhpcy50YXJnZXREaXN0YW5jZX1gLCBcIndhcm5pbmdcIik7XHJcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0RGlzdGFuY2UgPSB0aGlzLm1pbkRpc3RhbmNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaXNOYU4odGhpcy50YXJnZXRSb3RhdGlvbikpe1xyXG4gICAgICAgICAgICBhbGVydCh0aGlzLmV2ZW50cywgYEludmFsaWQgdGFyZ2V0Um90YXRpb246ICR7dGhpcy50YXJnZXRSb3RhdGlvbn1gLCBcIndhcm5pbmdcIik7XHJcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0Um90YXRpb24gPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaXNOYU4odGhpcy50YXJnZXRBbmdsZSkpe1xyXG4gICAgICAgICAgICBhbGVydCh0aGlzLmV2ZW50cywgYEludmFsaWQgdGFyZ2V0QW5nbGU6ICR7dGhpcy50YXJnZXRBbmdsZX1gLCBcIndhcm5pbmdcIik7XHJcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0QW5nbGUgPSB0aGlzLm1pbkFuZ2xlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gPT0gUmVtZW1iZXIgbGFzdCBwcm9jZXNzZWQgc3RhdGUgPT1cclxuICAgICAgICB0aGlzLmxhc3RNb3VzZS5jb3B5KHRoaXMubW91c2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZVpvb20oKSB7XHJcbiAgICAgICAgdGhpcy50YXJnZXREaXN0YW5jZSA9IE1hdGhVdGlscy5jbGFtcCh0aGlzLnRhcmdldERpc3RhbmNlLCB0aGlzLm1pbkRpc3RhbmNlLCB0aGlzLm1heERpc3RhbmNlKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZU1heEFuZ2xlRm9yWm9vbSgpO1xyXG4gICAgICAgIHRoaXMudGFyZ2V0QW5nbGUgPSBNYXRoVXRpbHMuY2xhbXAodGhpcy50YXJnZXRBbmdsZSwgdGhpcy5taW5BbmdsZSwgdGhpcy5tYXhBbmdsZUZvclpvb20pO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZU1heEFuZ2xlRm9yWm9vbSgpIHtcclxuICAgICAgICB0aGlzLm1heEFuZ2xlRm9yWm9vbSA9XHJcbiAgICAgICAgICAgIE1hdGhVdGlscy5jbGFtcChcclxuICAgICAgICAgICAgICAgICgxIC0gTWF0aC5wb3coKHRoaXMudGFyZ2V0RGlzdGFuY2UgLSB0aGlzLm1pbkRpc3RhbmNlKSAvICg1MDAgLSB0aGlzLm1pbkRpc3RhbmNlKSwgMC41KSkgKiB0aGlzLm1heEFuZ2xlLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5taW5BbmdsZSxcclxuICAgICAgICAgICAgICAgIHRoaXMubWF4QW5nbGVcclxuICAgICAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVQb3NpdGlvblRlcnJhaW5IZWlnaHQobWFwKSB7XHJcbiAgICAgICAgdGhpcy5wb3NpdGlvblRlcnJhaW5IZWlnaHQgPSBtYXAudGVycmFpbkhlaWdodEF0KHRoaXMudGFyZ2V0UG9zaXRpb24ueCwgdGhpcy50YXJnZXRQb3NpdGlvbi56KTtcclxuICAgIH1cclxuXHJcbiAgICB3cmFwUm90YXRpb24oKSB7XHJcbiAgICAgICAgd2hpbGUgKHRoaXMudGFyZ2V0Um90YXRpb24gPj0gTWF0aC5QSSkge1xyXG4gICAgICAgICAgICB0aGlzLnRhcmdldFJvdGF0aW9uIC09IE1hdGguUEkgKiAyO1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xzLnJvdGF0aW9uIC09IE1hdGguUEkgKiAyO1xyXG4gICAgICAgIH1cclxuICAgICAgICB3aGlsZSAodGhpcy50YXJnZXRSb3RhdGlvbiA8PSAtTWF0aC5QSSkge1xyXG4gICAgICAgICAgICB0aGlzLnRhcmdldFJvdGF0aW9uICs9IE1hdGguUEkgKiAyO1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xzLnJvdGF0aW9uICs9IE1hdGguUEkgKiAyO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbktleURvd24gPSBldnQgPT4ge1xyXG4gICAgICAgIGxldCBrZXkgPSBldnQua2V5IHx8IGV2dC5rZXlDb2RlO1xyXG4gICAgICAgIGZvciAobGV0IGFjdGlvbiBpbiBNYXBDb250cm9scy5LRVlTKXtcclxuICAgICAgICAgICAgaWYgKCFNYXBDb250cm9scy5LRVlTLmhhc093blByb3BlcnR5KGFjdGlvbikpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBpZiAoTWFwQ29udHJvbHMuS0VZU1thY3Rpb25dLmluY2x1ZGVzKGtleSkpe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5rZXlTdGF0ZXNbYWN0aW9uXSA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIG9uS2V5VXAgPSBldnQgPT4ge1xyXG4gICAgICAgIGxldCBrZXkgPSBldnQua2V5IHx8IGV2dC5rZXlDb2RlO1xyXG4gICAgICAgIGZvciAobGV0IGFjdGlvbiBpbiBNYXBDb250cm9scy5LRVlTKXtcclxuICAgICAgICAgICAgaWYgKCFNYXBDb250cm9scy5LRVlTLmhhc093blByb3BlcnR5KGFjdGlvbikpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBpZiAoTWFwQ29udHJvbHMuS0VZU1thY3Rpb25dLmluY2x1ZGVzKGtleSkpe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5rZXlTdGF0ZXNbYWN0aW9uXSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBvbldoZWVsID0gZXZ0ID0+IHtcclxuICAgICAgICBsZXQgZGVsdGEgPSBldnQuZGVsdGFZO1xyXG4gICAgICAgIGlmIChldnQuZGVsdGFNb2RlID09PSBXaGVlbEV2ZW50LkRPTV9ERUxUQV9QSVhFTCkgZGVsdGEgKj0gMC4wMTtcclxuICAgICAgICBpZiAoZXZ0LmRlbHRhTW9kZSA9PT0gV2hlZWxFdmVudC5ET01fREVMVEFfTElORSkgZGVsdGEgKj0gMC4zMztcclxuXHJcbiAgICAgICAgdGhpcy50YXJnZXREaXN0YW5jZSAqPSBNYXRoLnBvdygxLjUsIGRlbHRhKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVpvb20oKTtcclxuICAgIH1cclxuXHJcbiAgICBvbk1vdXNlRG93biA9IGV2dCA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgIT09IE1hcENvbnRyb2xzLlNUQVRFUy5OT05FKSByZXR1cm47XHJcblxyXG4gICAgICAgIGlmIChNYXBDb250cm9scy5CVVRUT05TLk1PVkUuaW5jbHVkZXMoZXZ0LmJ1dHRvbikpIHtcclxuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IE1hcENvbnRyb2xzLlNUQVRFUy5NT1ZFO1xyXG4gICAgICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKE1hcENvbnRyb2xzLkJVVFRPTlMuT1JCSVQuaW5jbHVkZXMoZXZ0LmJ1dHRvbikpIHtcclxuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IE1hcENvbnRyb2xzLlNUQVRFUy5PUkJJVDtcclxuICAgICAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBvbk1vdXNlTW92ZSA9IGV2dCA9PiB7XHJcbiAgICAgICAgdGhpcy5tb3VzZS5zZXQoZXZ0LmNsaWVudFgsIGV2dC5jbGllbnRZKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgIT09IE1hcENvbnRyb2xzLlNUQVRFUy5OT05FKXtcclxuICAgICAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBvbk1vdXNlVXAgPSBldnQgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09PSBNYXBDb250cm9scy5TVEFURVMuTk9ORSkgcmV0dXJuO1xyXG5cclxuICAgICAgICBpZiAoTWFwQ29udHJvbHMuQlVUVE9OUy5NT1ZFLmluY2x1ZGVzKGV2dC5idXR0b24pKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnN0YXRlID09PSBNYXBDb250cm9scy5TVEFURVMuTU9WRSkgdGhpcy5zdGF0ZSA9IE1hcENvbnRyb2xzLlNUQVRFUy5OT05FO1xyXG4gICAgICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKE1hcENvbnRyb2xzLkJVVFRPTlMuT1JCSVQuaW5jbHVkZXMoZXZ0LmJ1dHRvbikpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09IE1hcENvbnRyb2xzLlNUQVRFUy5PUkJJVCkgdGhpcy5zdGF0ZSA9IE1hcENvbnRyb2xzLlNUQVRFUy5OT05FO1xyXG4gICAgICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIG9uVG91Y2hEb3duID0gZXZ0ID0+IHtcclxuICAgICAgICBpZiAoZXZ0LnBvaW50ZXJUeXBlID09PSBcIm1vdXNlXCIpIHJldHVybjtcclxuXHJcbiAgICAgICAgdGhpcy50b3VjaFN0YXJ0LnNldCh0aGlzLnRhcmdldFBvc2l0aW9uLngsIHRoaXMudGFyZ2V0UG9zaXRpb24ueik7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IE1hcENvbnRyb2xzLlNUQVRFUy5NT1ZFO1xyXG4gICAgfTtcclxuXHJcbiAgICBvblRvdWNoTW92ZSA9IGV2dCA9PiB7XHJcbiAgICAgICAgaWYgKGV2dC5wb2ludGVyVHlwZSA9PT0gXCJtb3VzZVwiKSByZXR1cm47XHJcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgIT09IE1hcENvbnRyb2xzLlNUQVRFUy5NT1ZFKSByZXR1cm47XHJcblxyXG4gICAgICAgIGxldCB0b3VjaERlbHRhID0gbmV3IFZlY3RvcjIoZXZ0LmRlbHRhWCwgZXZ0LmRlbHRhWSk7XHJcblxyXG4gICAgICAgIGlmICh0b3VjaERlbHRhLnggIT09IDAgfHwgdG91Y2hEZWx0YS55ICE9PSAwKSB7XHJcbiAgICAgICAgICAgIHRvdWNoRGVsdGEucm90YXRlQXJvdW5kKE1hcENvbnRyb2xzLlZFQ1RPUjJfWkVSTywgdGhpcy5jb250cm9scy5yb3RhdGlvbik7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnRhcmdldFBvc2l0aW9uLnggPSB0aGlzLnRvdWNoU3RhcnQueCAtICh0b3VjaERlbHRhLnggKiB0aGlzLnRhcmdldERpc3RhbmNlIC8gdGhpcy5yb290RWxlbWVudC5jbGllbnRIZWlnaHQgKiAxLjUpO1xyXG4gICAgICAgICAgICB0aGlzLnRhcmdldFBvc2l0aW9uLnogPSB0aGlzLnRvdWNoU3RhcnQueSAtICh0b3VjaERlbHRhLnkgKiB0aGlzLnRhcmdldERpc3RhbmNlIC8gdGhpcy5yb290RWxlbWVudC5jbGllbnRIZWlnaHQgKiAxLjUpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgb25Ub3VjaFVwID0gZXZ0ID0+IHtcclxuICAgICAgICBpZiAoZXZ0LnBvaW50ZXJUeXBlID09PSBcIm1vdXNlXCIpIHJldHVybjtcclxuXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IE1hcENvbnRyb2xzLlNUQVRFUy5OT05FO1xyXG4gICAgfTtcclxuXHJcbiAgICBvblRvdWNoVGlsdERvd24gPSAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy50b3VjaFRpbHRTdGFydCA9IHRoaXMudGFyZ2V0QW5nbGU7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IE1hcENvbnRyb2xzLlNUQVRFUy5PUkJJVDtcclxuICAgIH07XHJcblxyXG4gICAgb25Ub3VjaFRpbHRNb3ZlID0gZXZ0ID0+IHtcclxuICAgICAgICBpZiAodGhpcy5zdGF0ZSAhPT0gTWFwQ29udHJvbHMuU1RBVEVTLk9SQklUKSByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMudGFyZ2V0QW5nbGUgPSB0aGlzLnRvdWNoVGlsdFN0YXJ0IC0gKGV2dC5kZWx0YVkgLyB0aGlzLnJvb3RFbGVtZW50LmNsaWVudEhlaWdodCAqIE1hdGguUEkpO1xyXG4gICAgICAgIHRoaXMudGFyZ2V0QW5nbGUgPSBNYXRoVXRpbHMuY2xhbXAodGhpcy50YXJnZXRBbmdsZSwgdGhpcy5taW5BbmdsZSwgdGhpcy5tYXhBbmdsZUZvclpvb20gKyAwLjEpO1xyXG4gICAgfTtcclxuXHJcbiAgICBvblRvdWNoVGlsdFVwID0gKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBNYXBDb250cm9scy5TVEFURVMuTk9ORTtcclxuICAgIH07XHJcblxyXG4gICAgb25Ub3VjaFJvdGF0ZURvd24gPSBldnQgPT4ge1xyXG4gICAgICAgIHRoaXMubGFzdFRvdWNoUm90YXRpb24gPSBldnQucm90YXRpb247XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IE1hcENvbnRyb2xzLlNUQVRFUy5PUkJJVDtcclxuICAgIH07XHJcblxyXG4gICAgb25Ub3VjaFJvdGF0ZU1vdmUgPSBldnQgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLnN0YXRlICE9PSBNYXBDb250cm9scy5TVEFURVMuT1JCSVQpIHJldHVybjtcclxuXHJcbiAgICAgICAgbGV0IGRlbHRhID0gZXZ0LnJvdGF0aW9uIC0gdGhpcy5sYXN0VG91Y2hSb3RhdGlvbjtcclxuICAgICAgICB0aGlzLmxhc3RUb3VjaFJvdGF0aW9uID0gZXZ0LnJvdGF0aW9uO1xyXG4gICAgICAgIGlmIChkZWx0YSA+IDE4MCkgZGVsdGEgLT0gMzYwO1xyXG4gICAgICAgIGlmIChkZWx0YSA8IC0xODApIGRlbHRhICs9IDM2MDtcclxuXHJcbiAgICAgICAgdGhpcy50YXJnZXRSb3RhdGlvbiAtPSAoZGVsdGEgKiAoTWF0aC5QSSAvIDE4MCkpICogMS40O1xyXG4gICAgICAgIHRoaXMud3JhcFJvdGF0aW9uKCk7XHJcbiAgICB9O1xyXG5cclxuICAgIG9uVG91Y2hSb3RhdGVVcCA9ICgpID0+IHtcclxuICAgICAgICB0aGlzLnN0YXRlID0gTWFwQ29udHJvbHMuU1RBVEVTLk5PTkU7XHJcbiAgICB9O1xyXG5cclxuICAgIG9uVG91Y2hab29tRG93biA9ICgpID0+IHtcclxuICAgICAgICB0aGlzLnRvdWNoWm9vbVN0YXJ0ID0gdGhpcy50YXJnZXREaXN0YW5jZTtcclxuICAgIH07XHJcblxyXG4gICAgb25Ub3VjaFpvb21Nb3ZlID0gZXZ0ID0+IHtcclxuICAgICAgICB0aGlzLnRhcmdldERpc3RhbmNlID0gdGhpcy50b3VjaFpvb21TdGFydCAvIGV2dC5zY2FsZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVpvb20oKTtcclxuICAgIH07XHJcbiAgICBcclxuICAgIG9uQ29udGV4dE1lbnUgPSBldnQgPT4ge1xyXG4gICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG5cclxufSIsIi8qKlxyXG4gKiBUYWtlbiBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9tcmRvb2IvdGhyZWUuanMvYmxvYi9tYXN0ZXIvZXhhbXBsZXMvanNtL2xpYnMvc3RhdHMubW9kdWxlLmpzXHJcbiAqL1xyXG5sZXQgU3RhdHMgPSBmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgbGV0IG1vZGUgPSAwO1xyXG5cclxuICAgIGxldCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAnZGl2JyApO1xyXG4gICAgY29udGFpbmVyLnN0eWxlLmNzc1RleHQgPSAncG9zaXRpb246YWJzb2x1dGU7Ym90dG9tOjVweDtyaWdodDo1cHg7Y3Vyc29yOnBvaW50ZXI7b3BhY2l0eTowLjk7ei1pbmRleDoxMDAwMCc7XHJcbiAgICBjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lciggJ2NsaWNrJywgZnVuY3Rpb24gKCBldmVudCApIHtcclxuXHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBzaG93UGFuZWwoICsrIG1vZGUgJSBjb250YWluZXIuY2hpbGRyZW4ubGVuZ3RoICk7XHJcblxyXG4gICAgfSwgZmFsc2UgKTtcclxuXHJcbiAgICAvL1xyXG5cclxuICAgIGZ1bmN0aW9uIGFkZFBhbmVsKCBwYW5lbCApIHtcclxuXHJcbiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKCBwYW5lbC5kb20gKTtcclxuICAgICAgICByZXR1cm4gcGFuZWw7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNob3dQYW5lbCggaWQgKSB7XHJcblxyXG4gICAgICAgIGZvciAoIGxldCBpID0gMDsgaSA8IGNvbnRhaW5lci5jaGlsZHJlbi5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG4gICAgICAgICAgICBjb250YWluZXIuY2hpbGRyZW5bIGkgXS5zdHlsZS5kaXNwbGF5ID0gaSA9PT0gaWQgPyAnYmxvY2snIDogJ25vbmUnO1xyXG5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG1vZGUgPSBpZDtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gaGlkZSgpIHtcclxuICAgICAgICBzaG93UGFuZWwoLTEpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vXHJcblxyXG4gICAgbGV0IGJlZ2luVGltZSA9ICggcGVyZm9ybWFuY2UgfHwgRGF0ZSApLm5vdygpLCBwcmV2VGltZSA9IGJlZ2luVGltZSwgZnJhbWVzID0gMDtcclxuICAgIGxldCBwcmV2RnJhbWVUaW1lID0gYmVnaW5UaW1lO1xyXG5cclxuICAgIGxldCBmcHNQYW5lbCA9IGFkZFBhbmVsKCBuZXcgU3RhdHMuUGFuZWwoICdGUFMnLCAnIzBmZicsICcjMDAyJyApICk7XHJcbiAgICBsZXQgbXNQYW5lbCA9IGFkZFBhbmVsKCBuZXcgU3RhdHMuUGFuZWwoICdNUyAocmVuZGVyKScsICcjMGYwJywgJyMwMjAnICkgKTtcclxuICAgIGxldCBsYXN0RnJhbWVNc1BhbmVsID0gYWRkUGFuZWwoIG5ldyBTdGF0cy5QYW5lbCggJ01TIChhbGwpJywgJyNmODAnLCAnIzIxMCcgKSApO1xyXG5cclxuICAgIGxldCBtZW1QYW5lbCA9IG51bGw7XHJcbiAgICBpZiAoIHNlbGYucGVyZm9ybWFuY2UgJiYgc2VsZi5wZXJmb3JtYW5jZS5tZW1vcnkgKSB7XHJcblxyXG4gICAgICAgIG1lbVBhbmVsID0gYWRkUGFuZWwoIG5ldyBTdGF0cy5QYW5lbCggJ01CJywgJyNmMDgnLCAnIzIwMScgKSApO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBzaG93UGFuZWwoIDAgKTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG5cclxuICAgICAgICBSRVZJU0lPTjogMTYsXHJcblxyXG4gICAgICAgIGRvbTogY29udGFpbmVyLFxyXG5cclxuICAgICAgICBhZGRQYW5lbDogYWRkUGFuZWwsXHJcbiAgICAgICAgc2hvd1BhbmVsOiBzaG93UGFuZWwsXHJcbiAgICAgICAgaGlkZTogaGlkZSxcclxuXHJcbiAgICAgICAgYmVnaW46IGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgICAgICAgIGJlZ2luVGltZSA9ICggcGVyZm9ybWFuY2UgfHwgRGF0ZSApLm5vdygpO1xyXG5cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBlbmQ6IGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgICAgICAgIGZyYW1lcyArKztcclxuXHJcbiAgICAgICAgICAgIGxldCB0aW1lID0gKCBwZXJmb3JtYW5jZSB8fCBEYXRlICkubm93KCk7XHJcblxyXG4gICAgICAgICAgICBtc1BhbmVsLnVwZGF0ZSggdGltZSAtIGJlZ2luVGltZSwgMjAwICk7XHJcbiAgICAgICAgICAgIGxhc3RGcmFtZU1zUGFuZWwudXBkYXRlKCB0aW1lIC0gcHJldkZyYW1lVGltZSwgMjAwIClcclxuXHJcbiAgICAgICAgICAgIGlmICggdGltZSA+PSBwcmV2VGltZSArIDEwMDAgKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgZnBzUGFuZWwudXBkYXRlKCAoIGZyYW1lcyAqIDEwMDAgKSAvICggdGltZSAtIHByZXZUaW1lICksIDEwMCApO1xyXG5cclxuICAgICAgICAgICAgICAgIHByZXZUaW1lID0gdGltZTtcclxuICAgICAgICAgICAgICAgIGZyYW1lcyA9IDA7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCBtZW1QYW5lbCApIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1lbW9yeSA9IHBlcmZvcm1hbmNlLm1lbW9yeTtcclxuICAgICAgICAgICAgICAgICAgICBtZW1QYW5lbC51cGRhdGUoIG1lbW9yeS51c2VkSlNIZWFwU2l6ZSAvIDEwNDg1NzYsIG1lbW9yeS5qc0hlYXBTaXplTGltaXQgLyAxMDQ4NTc2ICk7XHJcblxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRpbWU7XHJcblxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHVwZGF0ZTogZnVuY3Rpb24gKCkge1xyXG5cclxuICAgICAgICAgICAgYmVnaW5UaW1lID0gdGhpcy5lbmQoKTtcclxuICAgICAgICAgICAgcHJldkZyYW1lVGltZSA9IGJlZ2luVGltZTtcclxuXHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQmFja3dhcmRzIENvbXBhdGliaWxpdHlcclxuXHJcbiAgICAgICAgZG9tRWxlbWVudDogY29udGFpbmVyLFxyXG4gICAgICAgIHNldE1vZGU6IHNob3dQYW5lbFxyXG5cclxuICAgIH07XHJcblxyXG59O1xyXG5cclxuU3RhdHMuUGFuZWwgPSBmdW5jdGlvbiAoIG5hbWUsIGZnLCBiZyApIHtcclxuXHJcbiAgICBsZXQgbWluID0gSW5maW5pdHksIG1heCA9IDAsIHJvdW5kID0gTWF0aC5yb3VuZDtcclxuICAgIGxldCBQUiA9IHJvdW5kKCB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxICk7XHJcblxyXG4gICAgbGV0IFdJRFRIID0gMTYwICogUFIsIEhFSUdIVCA9IDk2ICogUFIsXHJcbiAgICAgICAgVEVYVF9YID0gMyAqIFBSLCBURVhUX1kgPSAzICogUFIsXHJcbiAgICAgICAgR1JBUEhfWCA9IDMgKiBQUiwgR1JBUEhfWSA9IDE1ICogUFIsXHJcbiAgICAgICAgR1JBUEhfV0lEVEggPSAxNTQgKiBQUiwgR1JBUEhfSEVJR0hUID0gNzcgKiBQUjtcclxuXHJcbiAgICBsZXQgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ2NhbnZhcycgKTtcclxuICAgIGNhbnZhcy53aWR0aCA9IFdJRFRIO1xyXG4gICAgY2FudmFzLmhlaWdodCA9IEhFSUdIVDtcclxuICAgIGNhbnZhcy5zdHlsZS5jc3NUZXh0ID0gJ3dpZHRoOjE2MHB4O2hlaWdodDo5NnB4JztcclxuXHJcbiAgICBsZXQgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCAnMmQnICk7XHJcbiAgICBjb250ZXh0LmZvbnQgPSAnYm9sZCAnICsgKCA5ICogUFIgKSArICdweCBIZWx2ZXRpY2EsQXJpYWwsc2Fucy1zZXJpZic7XHJcbiAgICBjb250ZXh0LnRleHRCYXNlbGluZSA9ICd0b3AnO1xyXG5cclxuICAgIGNvbnRleHQuZmlsbFN0eWxlID0gYmc7XHJcbiAgICBjb250ZXh0LmZpbGxSZWN0KCAwLCAwLCBXSURUSCwgSEVJR0hUICk7XHJcblxyXG4gICAgY29udGV4dC5maWxsU3R5bGUgPSBmZztcclxuICAgIGNvbnRleHQuZmlsbFRleHQoIG5hbWUsIFRFWFRfWCwgVEVYVF9ZICk7XHJcbiAgICBjb250ZXh0LmZpbGxSZWN0KCBHUkFQSF9YLCBHUkFQSF9ZLCBHUkFQSF9XSURUSCwgR1JBUEhfSEVJR0hUICk7XHJcblxyXG4gICAgY29udGV4dC5maWxsU3R5bGUgPSBiZztcclxuICAgIGNvbnRleHQuZ2xvYmFsQWxwaGEgPSAwLjk7XHJcbiAgICBjb250ZXh0LmZpbGxSZWN0KCBHUkFQSF9YLCBHUkFQSF9ZLCBHUkFQSF9XSURUSCwgR1JBUEhfSEVJR0hUICk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuXHJcbiAgICAgICAgZG9tOiBjYW52YXMsXHJcblxyXG4gICAgICAgIHVwZGF0ZTogZnVuY3Rpb24gKCB2YWx1ZSwgbWF4VmFsdWUgKSB7XHJcblxyXG4gICAgICAgICAgICBtaW4gPSBNYXRoLm1pbiggbWluLCB2YWx1ZSApO1xyXG4gICAgICAgICAgICBtYXggPSBNYXRoLm1heCggbWF4LCB2YWx1ZSApO1xyXG5cclxuICAgICAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBiZztcclxuICAgICAgICAgICAgY29udGV4dC5nbG9iYWxBbHBoYSA9IDE7XHJcbiAgICAgICAgICAgIGNvbnRleHQuZmlsbFJlY3QoIDAsIDAsIFdJRFRILCBHUkFQSF9ZICk7XHJcbiAgICAgICAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gZmc7XHJcbiAgICAgICAgICAgIGNvbnRleHQuZmlsbFRleHQoIHJvdW5kKCB2YWx1ZSApICsgJyAnICsgbmFtZSArICcgKCcgKyByb3VuZCggbWluICkgKyAnLScgKyByb3VuZCggbWF4ICkgKyAnKScsIFRFWFRfWCwgVEVYVF9ZICk7XHJcblxyXG4gICAgICAgICAgICBjb250ZXh0LmRyYXdJbWFnZSggY2FudmFzLCBHUkFQSF9YICsgUFIsIEdSQVBIX1ksIEdSQVBIX1dJRFRIIC0gUFIsIEdSQVBIX0hFSUdIVCwgR1JBUEhfWCwgR1JBUEhfWSwgR1JBUEhfV0lEVEggLSBQUiwgR1JBUEhfSEVJR0hUICk7XHJcblxyXG4gICAgICAgICAgICBjb250ZXh0LmZpbGxSZWN0KCBHUkFQSF9YICsgR1JBUEhfV0lEVEggLSBQUiwgR1JBUEhfWSwgUFIsIEdSQVBIX0hFSUdIVCApO1xyXG5cclxuICAgICAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBiZztcclxuICAgICAgICAgICAgY29udGV4dC5nbG9iYWxBbHBoYSA9IDAuOTtcclxuICAgICAgICAgICAgY29udGV4dC5maWxsUmVjdCggR1JBUEhfWCArIEdSQVBIX1dJRFRIIC0gUFIsIEdSQVBIX1ksIFBSLCByb3VuZCggKCAxIC0gKCB2YWx1ZSAvIG1heFZhbHVlICkgKSAqIEdSQVBIX0hFSUdIVCApICk7XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9O1xyXG5cclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IFN0YXRzOyIsIi8qXHJcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJsdWVNYXAsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSAoTUlUKS5cclxuICpcclxuICogQ29weXJpZ2h0IChjKSBCbHVlIChMdWthcyBSaWVnZXIpIDxodHRwczovL2JsdWVjb2xvcmVkLmRlPlxyXG4gKiBDb3B5cmlnaHQgKGMpIGNvbnRyaWJ1dG9yc1xyXG4gKlxyXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XHJcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICdTb2Z0d2FyZScpLCB0byBkZWFsXHJcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcclxuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxyXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcclxuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcclxuICpcclxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cclxuICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXHJcbiAqXHJcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAnQVMgSVMnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXHJcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxyXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcclxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxyXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxyXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXHJcbiAqIFRIRSBTT0ZUV0FSRS5cclxuICovXHJcbmltcG9ydCB7IFNoYWRlckNodW5rIH0gZnJvbSAndGhyZWUnO1xyXG5cclxuZXhwb3J0IGNvbnN0IEhJUkVTX1ZFUlRFWF9TSEFERVIgPSBgXHJcbiNpbmNsdWRlIDxjb21tb24+XHJcbiR7U2hhZGVyQ2h1bmsubG9nZGVwdGhidWZfcGFyc192ZXJ0ZXh9XHJcblxyXG5hdHRyaWJ1dGUgZmxvYXQgYW87XHJcbmF0dHJpYnV0ZSBmbG9hdCBzdW5saWdodDtcclxuYXR0cmlidXRlIGZsb2F0IGJsb2NrbGlnaHQ7XHJcblxyXG52YXJ5aW5nIHZlYzMgdlBvc2l0aW9uO1xyXG52YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XHJcbnZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xyXG52YXJ5aW5nIHZlYzIgdlV2O1xyXG52YXJ5aW5nIHZlYzMgdkNvbG9yO1xyXG52YXJ5aW5nIGZsb2F0IHZBbztcclxudmFyeWluZyBmbG9hdCB2U3VubGlnaHQ7XHJcbnZhcnlpbmcgZmxvYXQgdkJsb2NrbGlnaHQ7XHJcblxyXG52b2lkIG1haW4oKSB7XHJcblx0dlBvc2l0aW9uID0gcG9zaXRpb247XHJcblx0dldvcmxkUG9zaXRpb24gPSAobW9kZWxNYXRyaXggKiB2ZWM0KHBvc2l0aW9uLCAxKSkueHl6O1xyXG5cdHZOb3JtYWwgPSBub3JtYWw7XHJcblx0dlV2ID0gdXY7XHJcblx0dkNvbG9yID0gY29sb3I7XHJcblx0dkFvID0gYW87XHJcblx0dlN1bmxpZ2h0ID0gc3VubGlnaHQ7XHJcblx0dkJsb2NrbGlnaHQgPSBibG9ja2xpZ2h0O1xyXG5cdFxyXG5cdGdsX1Bvc2l0aW9uID0gXHJcblx0XHRwcm9qZWN0aW9uTWF0cml4ICpcclxuXHRcdHZpZXdNYXRyaXggKlxyXG5cdFx0bW9kZWxNYXRyaXggKlxyXG5cdFx0dmVjNChwb3NpdGlvbiwgMSk7XHJcblx0XHJcblx0JHtTaGFkZXJDaHVuay5sb2dkZXB0aGJ1Zl92ZXJ0ZXh9IFxyXG59XHJcbmA7XHJcbiIsIi8qXHJcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJsdWVNYXAsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSAoTUlUKS5cclxuICpcclxuICogQ29weXJpZ2h0IChjKSBCbHVlIChMdWthcyBSaWVnZXIpIDxodHRwczovL2JsdWVjb2xvcmVkLmRlPlxyXG4gKiBDb3B5cmlnaHQgKGMpIGNvbnRyaWJ1dG9yc1xyXG4gKlxyXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XHJcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICdTb2Z0d2FyZScpLCB0byBkZWFsXHJcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcclxuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxyXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcclxuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcclxuICpcclxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cclxuICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXHJcbiAqXHJcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAnQVMgSVMnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXHJcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxyXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcclxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxyXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxyXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXHJcbiAqIFRIRSBTT0ZUV0FSRS5cclxuICovXHJcbmltcG9ydCB7IFNoYWRlckNodW5rIH0gZnJvbSAndGhyZWUnO1xyXG5cclxuZXhwb3J0IGNvbnN0IEhJUkVTX0ZSQUdNRU5UX1NIQURFUiA9IGBcclxuJHtTaGFkZXJDaHVuay5sb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50fVxyXG5cclxudW5pZm9ybSBzYW1wbGVyMkQgdGV4dHVyZUltYWdlO1xyXG51bmlmb3JtIGZsb2F0IHN1bmxpZ2h0U3RyZW5ndGg7XHJcbnVuaWZvcm0gZmxvYXQgYW1iaWVudExpZ2h0O1xyXG5cclxudmFyeWluZyB2ZWMzIHZQb3NpdGlvbjtcclxudmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xyXG52YXJ5aW5nIHZlYzMgdk5vcm1hbDtcclxudmFyeWluZyB2ZWMyIHZVdjtcclxudmFyeWluZyB2ZWMzIHZDb2xvcjtcclxudmFyeWluZyBmbG9hdCB2QW87XHJcbnZhcnlpbmcgZmxvYXQgdlN1bmxpZ2h0O1xyXG52YXJ5aW5nIGZsb2F0IHZCbG9ja2xpZ2h0O1xyXG5cclxudm9pZCBtYWluKCkge1xyXG5cdHZlYzQgY29sb3IgPSB0ZXh0dXJlKHRleHR1cmVJbWFnZSwgdlV2KTtcclxuXHRpZiAoY29sb3IuYSA9PSAwLjApIGRpc2NhcmQ7XHJcblx0XHJcblx0Ly9hcHBseSB2ZXJ0ZXgtY29sb3JcclxuXHRjb2xvci5yZ2IgKj0gdkNvbG9yLnJnYjtcclxuXHJcblx0Ly9hcHBseSBhb1xyXG5cdGNvbG9yLnJnYiAqPSB2QW87XHJcblx0XHJcblx0Ly9hcHBseSBsaWdodFxyXG5cdGZsb2F0IGxpZ2h0ID0gbWl4KHZCbG9ja2xpZ2h0LCBtYXgodlN1bmxpZ2h0LCB2QmxvY2tsaWdodCksIHN1bmxpZ2h0U3RyZW5ndGgpO1xyXG5cdGNvbG9yLnJnYiAqPSBtaXgoYW1iaWVudExpZ2h0LCAxLjAsIGxpZ2h0IC8gMTUuMCk7XHJcblx0XHJcblx0Z2xfRnJhZ0NvbG9yID0gY29sb3I7XHJcblx0XHJcblx0JHtTaGFkZXJDaHVuay5sb2dkZXB0aGJ1Zl9mcmFnbWVudH1cclxufVxyXG5gO1xyXG4iLCIvKlxyXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBCbHVlTWFwLCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgKE1JVCkuXHJcbiAqXHJcbiAqIENvcHlyaWdodCAoYykgQmx1ZSAoTHVrYXMgUmllZ2VyKSA8aHR0cHM6Ly9ibHVlY29sb3JlZC5kZT5cclxuICogQ29weXJpZ2h0IChjKSBjb250cmlidXRvcnNcclxuICpcclxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxyXG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAnU29mdHdhcmUnKSwgdG8gZGVhbFxyXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXHJcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcclxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXHJcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XHJcbiAqXHJcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXHJcbiAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxyXG4gKlxyXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgJ0FTIElTJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxyXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcclxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXHJcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcclxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcclxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxyXG4gKiBUSEUgU09GVFdBUkUuXHJcbiAqL1xyXG5pbXBvcnQgeyBTaGFkZXJDaHVuayB9IGZyb20gJ3RocmVlJztcclxuXHJcbmV4cG9ydCBjb25zdCBMT1dSRVNfVkVSVEVYX1NIQURFUiA9IGBcclxuI2luY2x1ZGUgPGNvbW1vbj5cclxuJHtTaGFkZXJDaHVuay5sb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleH1cclxuXHJcbnZhcnlpbmcgdmVjMyB2UG9zaXRpb247XHJcbnZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcclxudmFyeWluZyB2ZWMzIHZOb3JtYWw7XHJcbnZhcnlpbmcgdmVjMiB2VXY7XHJcbnZhcnlpbmcgdmVjMyB2Q29sb3I7XHJcblxyXG52b2lkIG1haW4oKSB7XHJcblx0dlBvc2l0aW9uID0gcG9zaXRpb247XHJcblx0dldvcmxkUG9zaXRpb24gPSAobW9kZWxNYXRyaXggKiB2ZWM0KHBvc2l0aW9uLCAxKSkueHl6O1xyXG5cdHZOb3JtYWwgPSBub3JtYWw7XHJcblx0dlV2ID0gdXY7XHJcblx0dkNvbG9yID0gY29sb3I7XHJcblx0XHJcblx0Z2xfUG9zaXRpb24gPSBcclxuXHRcdHByb2plY3Rpb25NYXRyaXggKlxyXG5cdFx0dmlld01hdHJpeCAqXHJcblx0XHRtb2RlbE1hdHJpeCAqXHJcblx0XHR2ZWM0KHBvc2l0aW9uLCAxKTtcclxuXHRcdFxyXG5cdCR7U2hhZGVyQ2h1bmsubG9nZGVwdGhidWZfdmVydGV4fVxyXG59XHJcbmA7XHJcbiIsIi8qXHJcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJsdWVNYXAsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSAoTUlUKS5cclxuICpcclxuICogQ29weXJpZ2h0IChjKSBCbHVlIChMdWthcyBSaWVnZXIpIDxodHRwczovL2JsdWVjb2xvcmVkLmRlPlxyXG4gKiBDb3B5cmlnaHQgKGMpIGNvbnRyaWJ1dG9yc1xyXG4gKlxyXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XHJcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICdTb2Z0d2FyZScpLCB0byBkZWFsXHJcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcclxuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxyXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcclxuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcclxuICpcclxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cclxuICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXHJcbiAqXHJcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAnQVMgSVMnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXHJcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxyXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcclxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxyXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxyXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXHJcbiAqIFRIRSBTT0ZUV0FSRS5cclxuICovXHJcbmltcG9ydCB7IFNoYWRlckNodW5rIH0gZnJvbSAndGhyZWUnO1xyXG5cclxuZXhwb3J0IGNvbnN0IExPV1JFU19GUkFHTUVOVF9TSEFERVIgPSBgXHJcbiR7U2hhZGVyQ2h1bmsubG9nZGVwdGhidWZfcGFyc19mcmFnbWVudH1cclxuXHJcbnN0cnVjdCBUaWxlTWFwIHtcclxuXHRzYW1wbGVyMkQgbWFwO1xyXG5cdGZsb2F0IHNpemU7XHJcblx0dmVjMiBzY2FsZTtcclxuXHR2ZWMyIHRyYW5zbGF0ZTtcclxuXHR2ZWMyIHBvczsgXHJcbn07XHJcblxyXG51bmlmb3JtIGZsb2F0IHN1bmxpZ2h0U3RyZW5ndGg7XHJcbnVuaWZvcm0gZmxvYXQgYW1iaWVudExpZ2h0O1xyXG51bmlmb3JtIFRpbGVNYXAgaGlyZXNUaWxlTWFwO1xyXG5cclxudmFyeWluZyB2ZWMzIHZQb3NpdGlvbjtcclxudmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xyXG52YXJ5aW5nIHZlYzMgdk5vcm1hbDtcclxudmFyeWluZyB2ZWMyIHZVdjtcclxudmFyeWluZyB2ZWMzIHZDb2xvcjtcclxuXHJcbnZvaWQgbWFpbigpIHtcclxuXHRmbG9hdCBkZXB0aCA9IGdsX0ZyYWdDb29yZC56IC8gZ2xfRnJhZ0Nvb3JkLnc7XHJcblxyXG5cdC8vZGlzY2FyZCBpZiBoaXJlcyB0aWxlIGlzIGxvYWRlZCBhdCB0aGF0IHBvc2l0aW9uXHJcblx0aWYgKCFpc09ydGhvZ3JhcGhpYyAmJiBkZXB0aCA8IDE5MDAuMCAmJiB0ZXh0dXJlKGhpcmVzVGlsZU1hcC5tYXAsICgodldvcmxkUG9zaXRpb24ueHogLSBoaXJlc1RpbGVNYXAudHJhbnNsYXRlKSAvIGhpcmVzVGlsZU1hcC5zY2FsZSAtIGhpcmVzVGlsZU1hcC5wb3MpIC8gaGlyZXNUaWxlTWFwLnNpemUgKyAwLjUpLnIgPj0gMS4wKSBkaXNjYXJkO1xyXG5cdFxyXG5cdHZlYzQgY29sb3IgPSB2ZWM0KHZDb2xvciwgMS4wKTtcclxuXHJcblx0ZmxvYXQgZGlmZiA9IHNxcnQobWF4KGRvdCh2Tm9ybWFsLCB2ZWMzKDAuMzYzNywgMC43Mjc0LCAwLjU4MTkpKSwgMC4wKSkgKiAwLjQgKyAwLjY7XHJcblx0Y29sb3IgKj0gZGlmZjtcclxuXHJcblx0Y29sb3IgKj0gbWl4KHN1bmxpZ2h0U3RyZW5ndGgsIDEuMCwgYW1iaWVudExpZ2h0KTtcclxuXHJcblx0Z2xfRnJhZ0NvbG9yID0gY29sb3I7XHJcblx0XHJcblx0JHtTaGFkZXJDaHVuay5sb2dkZXB0aGJ1Zl9mcmFnbWVudH1cclxufVxyXG5gO1xyXG4iLCJpbXBvcnQge01hdGhVdGlscywgTWF0cml4NCwgUGVyc3BlY3RpdmVDYW1lcmF9IGZyb20gXCJ0aHJlZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIENvbWJpbmVkQ2FtZXJhIGV4dGVuZHMgUGVyc3BlY3RpdmVDYW1lcmEge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIsIG9ydGhvKSB7XHJcbiAgICAgICAgc3VwZXIoZm92LCBhc3BlY3QsIG5lYXIsIGZhcik7XHJcblxyXG4gICAgICAgIHRoaXMub3J0aG8gPSBvcnRobztcclxuICAgICAgICB0aGlzLmRpc3RhbmNlID0gMTtcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVQcm9qZWN0aW9uTWF0cml4KCkge1xyXG4gICAgICAgIGlmICghdGhpcy5vcnRvZ3JhcGhpY1Byb2plY3Rpb24pXHJcbiAgICAgICAgICAgIHRoaXMub3J0b2dyYXBoaWNQcm9qZWN0aW9uID0gbmV3IE1hdHJpeDQoKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLnBlcnNwZWN0aXZlUHJvamVjdGlvbilcclxuICAgICAgICAgICAgdGhpcy5wZXJzcGVjdGl2ZVByb2plY3Rpb24gPSBuZXcgTWF0cml4NCgpO1xyXG5cclxuICAgICAgICAvL2NvcGllZCBmcm9tIFBlcnNwZWN0aXZlQ2FtZXJhXHJcbiAgICAgICAgY29uc3QgbmVhciA9IHRoaXMubmVhcjtcclxuICAgICAgICBsZXQgdG9wID0gbmVhciAqIE1hdGgudGFuKCBNYXRoVXRpbHMuREVHMlJBRCAqIDAuNSAqIHRoaXMuZm92ICkgLyB0aGlzLnpvb207XHJcbiAgICAgICAgbGV0IGhlaWdodCA9IDIgKiB0b3A7XHJcbiAgICAgICAgbGV0IHdpZHRoID0gdGhpcy5hc3BlY3QgKiBoZWlnaHQ7XHJcbiAgICAgICAgbGV0IGxlZnQgPSAtIDAuNSAqIHdpZHRoO1xyXG4gICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXc7XHJcblxyXG4gICAgICAgIGlmICggdGhpcy52aWV3ICE9PSBudWxsICYmIHRoaXMudmlldy5lbmFibGVkICkge1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZnVsbFdpZHRoID0gdmlldy5mdWxsV2lkdGgsXHJcbiAgICAgICAgICAgICAgICBmdWxsSGVpZ2h0ID0gdmlldy5mdWxsSGVpZ2h0O1xyXG5cclxuICAgICAgICAgICAgbGVmdCArPSB2aWV3Lm9mZnNldFggKiB3aWR0aCAvIGZ1bGxXaWR0aDtcclxuICAgICAgICAgICAgdG9wIC09IHZpZXcub2Zmc2V0WSAqIGhlaWdodCAvIGZ1bGxIZWlnaHQ7XHJcbiAgICAgICAgICAgIHdpZHRoICo9IHZpZXcud2lkdGggLyBmdWxsV2lkdGg7XHJcbiAgICAgICAgICAgIGhlaWdodCAqPSB2aWV3LmhlaWdodCAvIGZ1bGxIZWlnaHQ7XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgc2tldyA9IHRoaXMuZmlsbU9mZnNldDtcclxuICAgICAgICBpZiAoIHNrZXcgIT09IDAgKSBsZWZ0ICs9IG5lYXIgKiBza2V3IC8gdGhpcy5nZXRGaWxtV2lkdGgoKTtcclxuXHJcbiAgICAgICAgLy8gdGhpcyBwYXJ0IGRpZmZlcmVudCB0byBQZXJzcGVjdGl2ZUNhbWVyYVxyXG4gICAgICAgIGxldCBub3JtYWxpemVkT3J0aG8gPSAtTWF0aC5wb3codGhpcy5vcnRobyAtIDEsIDQpICsgMTtcclxuICAgICAgICBsZXQgb3J0aG9Ub3AgPSB0aGlzLmRpc3RhbmNlICogTWF0aC50YW4oIE1hdGhVdGlscy5ERUcyUkFEICogMC41ICogdGhpcy5mb3YgKSAvIHRoaXMuem9vbTtcclxuICAgICAgICBsZXQgb3J0aG9IZWlnaHQgPSAyICogb3J0aG9Ub3A7XHJcbiAgICAgICAgbGV0IG9ydGhvV2lkdGggPSB0aGlzLmFzcGVjdCAqIG9ydGhvSGVpZ2h0O1xyXG4gICAgICAgIGxldCBvcnRob0xlZnQgPSAtIDAuNSAqIG9ydGhvV2lkdGg7XHJcblxyXG4gICAgICAgIHRoaXMucGVyc3BlY3RpdmVQcm9qZWN0aW9uLm1ha2VQZXJzcGVjdGl2ZSggbGVmdCwgbGVmdCArIHdpZHRoLCB0b3AsIHRvcCAtIGhlaWdodCwgbmVhciwgdGhpcy5mYXIgKTtcclxuICAgICAgICB0aGlzLm9ydG9ncmFwaGljUHJvamVjdGlvbi5tYWtlT3J0aG9ncmFwaGljKCBvcnRob0xlZnQsIG9ydGhvTGVmdCArIG9ydGhvV2lkdGgsIG9ydGhvVG9wLCBvcnRob1RvcCAtIG9ydGhvSGVpZ2h0LCBuZWFyLCB0aGlzLmZhciApO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDE2OyBpKyspe1xyXG4gICAgICAgICAgICB0aGlzLnByb2plY3Rpb25NYXRyaXguZWxlbWVudHNbaV0gPSAodGhpcy5wZXJzcGVjdGl2ZVByb2plY3Rpb24uZWxlbWVudHNbaV0gKiAoMSAtIG5vcm1hbGl6ZWRPcnRobykpICsgKHRoaXMub3J0b2dyYXBoaWNQcm9qZWN0aW9uLmVsZW1lbnRzW2ldICogbm9ybWFsaXplZE9ydGhvKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gdG8gaGVyZVxyXG5cclxuICAgICAgICB0aGlzLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkoIHRoaXMucHJvamVjdGlvbk1hdHJpeCApLmludmVydCgpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBnZXQgaXNQZXJzcGVjdGl2ZUNhbWVyYSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vcnRobyA8IDE7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGlzT3J0aG9ncmFwaGljQ2FtZXJhKCkge1xyXG4gICAgICAgIHJldHVybiAhdGhpcy5pc1BlcnNwZWN0aXZlQ2FtZXJhO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCB0eXBlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmlzUGVyc3BlY3RpdmVDYW1lcmEgPyAnUGVyc3BlY3RpdmVDYW1lcmEnIDogJ09ydGhvZ3JhcGhpY0NhbWVyYSc7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IHR5cGUodHlwZSkge1xyXG4gICAgICAgIC8vaWdub3JlXHJcbiAgICB9XHJcblxyXG59IiwiaW1wb3J0IHtcclxuXHRQZXJzcGVjdGl2ZUNhbWVyYSxcclxuXHRXZWJHTFJlbmRlcmVyLFxyXG5cdFZlY3RvcjIsIFJheWNhc3RlciwgTGF5ZXJzXHJcbn0gZnJvbSBcInRocmVlXCI7XHJcbmltcG9ydCB7TWFwfSBmcm9tIFwiLi9tYXAvTWFwXCI7XHJcbmltcG9ydCB7U2t5Ym94U2NlbmV9IGZyb20gXCIuL3NreWJveC9Ta3lib3hTY2VuZVwiO1xyXG5pbXBvcnQge0NvbnRyb2xzTWFuYWdlcn0gZnJvbSBcIi4vY29udHJvbHMvQ29udHJvbHNNYW5hZ2VyXCI7XHJcbmltcG9ydCB7TWFwQ29udHJvbHN9IGZyb20gXCIuL2NvbnRyb2xzL01hcENvbnRyb2xzXCI7XHJcbmltcG9ydCBTdGF0cyBmcm9tIFwiLi91dGlsL1N0YXRzXCI7XHJcbmltcG9ydCB7YWxlcnQsIGRpc3BhdGNoRXZlbnQsIGVsZW1lbnRPZmZzZXQsIGh0bWxUb0VsZW1lbnR9IGZyb20gXCIuL3V0aWwvVXRpbHNcIjtcclxuaW1wb3J0IHtUaWxlTWFuYWdlcn0gZnJvbSBcIi4vbWFwL1RpbGVNYW5hZ2VyXCI7XHJcbmltcG9ydCB7SElSRVNfVkVSVEVYX1NIQURFUn0gZnJvbSBcIi4vbWFwL2hpcmVzL0hpcmVzVmVydGV4U2hhZGVyXCI7XHJcbmltcG9ydCB7SElSRVNfRlJBR01FTlRfU0hBREVSfSBmcm9tIFwiLi9tYXAvaGlyZXMvSGlyZXNGcmFnbWVudFNoYWRlclwiO1xyXG5pbXBvcnQge0xPV1JFU19WRVJURVhfU0hBREVSfSBmcm9tIFwiLi9tYXAvbG93cmVzL0xvd3Jlc1ZlcnRleFNoYWRlclwiO1xyXG5pbXBvcnQge0xPV1JFU19GUkFHTUVOVF9TSEFERVJ9IGZyb20gXCIuL21hcC9sb3dyZXMvTG93cmVzRnJhZ21lbnRTaGFkZXJcIjtcclxuaW1wb3J0IHtDb21iaW5lZENhbWVyYX0gZnJvbSBcIi4vdXRpbC9Db21iaW5lZENhbWVyYVwiO1xyXG5pbXBvcnQge0NTUzJEUmVuZGVyZXJ9IGZyb20gXCIuL3V0aWwvQ1NTMkRSZW5kZXJlclwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE1hcFZpZXdlciB7XHJcblxyXG5cdHN0YXRpYyBJbnRlcmFjdGlvblR5cGUgPSB7XHJcblx0XHRMRUZUQ0xJQ0s6IDAsXHJcblx0XHRSSUdIVENMSUNLOiAxXHJcblx0fTtcclxuXHJcblx0Y29uc3RydWN0b3IoZWxlbWVudCwgZGF0YVVybCA9IFwiZGF0YS9cIiwgbGl2ZUFwaVVybCA9IFwibGl2ZS9cIiwgZXZlbnRzID0gZWxlbWVudCkge1xyXG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCAnaXNNYXBWaWV3ZXInLCB7IHZhbHVlOiB0cnVlIH0gKTtcclxuXHJcblx0XHR0aGlzLnJvb3RFbGVtZW50ID0gZWxlbWVudDtcclxuXHRcdHRoaXMuZXZlbnRzID0gZXZlbnRzO1xyXG5cclxuXHRcdHRoaXMuZGF0YVVybCA9IGRhdGFVcmw7XHJcblx0XHR0aGlzLmxpdmVBcGlVcmwgPSBsaXZlQXBpVXJsO1xyXG5cclxuXHRcdHRoaXMuc3RhdHMgPSBuZXcgU3RhdHMoKTtcclxuXHRcdHRoaXMuc3RhdHMuaGlkZSgpO1xyXG5cclxuXHRcdHRoaXMuc3VwZXJTYW1wbGluZ1ZhbHVlID0gMTtcclxuXHRcdHRoaXMubG9hZGVkQ2VudGVyID0gbmV3IFZlY3RvcjIoMCwgMCk7XHJcblx0XHR0aGlzLmxvYWRlZEhpcmVzVmlld0Rpc3RhbmNlID0gMjAwO1xyXG5cdFx0dGhpcy5sb2FkZWRMb3dyZXNWaWV3RGlzdGFuY2UgPSAyMDAwO1xyXG5cclxuXHRcdC8vIHVuaWZvcm1zXHJcblx0XHR0aGlzLnVuaWZvcm1zID0ge1xyXG5cdFx0XHRzdW5saWdodFN0cmVuZ3RoOiB7IHZhbHVlOiAxIH0sXHJcblx0XHRcdGFtYmllbnRMaWdodDogeyB2YWx1ZTogMCB9LFxyXG5cdFx0XHRoaXJlc1RpbGVNYXA6IHtcclxuXHRcdFx0XHR2YWx1ZToge1xyXG5cdFx0XHRcdFx0bWFwOiBudWxsLFxyXG5cdFx0XHRcdFx0c2l6ZTogVGlsZU1hbmFnZXIudGlsZU1hcFNpemUsXHJcblx0XHRcdFx0XHRzY2FsZTogbmV3IFZlY3RvcjIoMSwgMSksXHJcblx0XHRcdFx0XHR0cmFuc2xhdGU6IG5ldyBWZWN0b3IyKCksXHJcblx0XHRcdFx0XHRwb3M6IG5ldyBWZWN0b3IyKCksXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9O1xyXG5cclxuXHRcdC8vIHJlbmRlcmVyXHJcblx0XHR0aGlzLnJlbmRlcmVyID0gbmV3IFdlYkdMUmVuZGVyZXIoe1xyXG5cdFx0XHRhbnRpYWxpYXM6IHRydWUsXHJcblx0XHRcdHNvcnRPYmplY3RzOiB0cnVlLFxyXG5cdFx0XHRwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6IHRydWUsXHJcblx0XHRcdGxvZ2FyaXRobWljRGVwdGhCdWZmZXI6IHRydWUsXHJcblx0XHR9KTtcclxuXHRcdHRoaXMucmVuZGVyZXIuYXV0b0NsZWFyID0gZmFsc2U7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnVuaWZvcm1zID0gdGhpcy51bmlmb3JtcztcclxuXHJcblx0XHQvLyBDU1MyRCByZW5kZXJlclxyXG5cdFx0dGhpcy5jc3MyZFJlbmRlcmVyID0gbmV3IENTUzJEUmVuZGVyZXIoKTtcclxuXHJcblx0XHR0aGlzLnNreWJveFNjZW5lID0gbmV3IFNreWJveFNjZW5lKCk7XHJcblxyXG5cdFx0dGhpcy5jYW1lcmEgPSBuZXcgQ29tYmluZWRDYW1lcmEoNzUsIDEsIDAuMSwgMTAwMDAsIDApO1xyXG5cdFx0dGhpcy5za3lib3hDYW1lcmEgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoNzUsIDEsIDAuMSwgMTAwMDApO1xyXG5cclxuXHRcdHRoaXMuaGFtbWVyID0gbmV3IEhhbW1lci5NYW5hZ2VyKHRoaXMucm9vdEVsZW1lbnQpO1xyXG5cdFx0dGhpcy5pbml0aWFsaXplSGFtbWVyKCk7XHJcblxyXG5cdFx0dGhpcy5jb250cm9sc01hbmFnZXIgPSBuZXcgQ29udHJvbHNNYW5hZ2VyKHRoaXMsIHRoaXMuY2FtZXJhKTtcclxuXHRcdHRoaXMuY29udHJvbHNNYW5hZ2VyLmNvbnRyb2xzID0gbmV3IE1hcENvbnRyb2xzKHRoaXMucm9vdEVsZW1lbnQsIHRoaXMuaGFtbWVyLCB0aGlzLmV2ZW50cyk7XHJcblxyXG5cdFx0dGhpcy5yYXljYXN0ZXIgPSBuZXcgUmF5Y2FzdGVyKCk7XHJcblx0XHR0aGlzLnJheWNhc3Rlci5sYXllcnMuZW5hYmxlQWxsKCk7XHJcblx0XHR0aGlzLnJheWNhc3Rlci5wYXJhbXMuTGluZTIgPSB7dGhyZXNob2xkOiAyMH1cclxuXHJcblx0XHR0aGlzLm1hcCA9IG51bGw7XHJcblxyXG5cdFx0dGhpcy5sYXN0RnJhbWUgPSAwO1xyXG5cclxuXHRcdC8vIGluaXRpYWxpemVcclxuXHRcdHRoaXMuaW5pdGlhbGl6ZVJvb3RFbGVtZW50KCk7XHJcblxyXG5cdFx0Ly8gaGFuZGxlIHNvbWUgZXZlbnRzXHJcblx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB0aGlzLmhhbmRsZUNvbnRhaW5lclJlc2l6ZSk7XHJcblxyXG5cdFx0Ly8gc3RhcnQgcmVuZGVyLWxvb3BcclxuXHRcdHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLnJlbmRlckxvb3ApO1xyXG5cdH1cclxuXHJcblx0aW5pdGlhbGl6ZUhhbW1lcigpIHtcclxuXHRcdGxldCB0b3VjaFRhcCA9IG5ldyBIYW1tZXIuVGFwKHsgZXZlbnQ6ICd0YXAnLCBwb2ludGVyczogMSwgdGFwczogMSwgdGhyZXNob2xkOiAyIH0pO1xyXG5cdFx0bGV0IHRvdWNoTW92ZSA9IG5ldyBIYW1tZXIuUGFuKHsgZXZlbnQ6ICdtb3ZlJywgZGlyZWN0aW9uOiBIYW1tZXIuRElSRUNUSU9OX0FMTCwgdGhyZXNob2xkOiAwIH0pO1xyXG5cdFx0bGV0IHRvdWNoVGlsdCA9ICBuZXcgSGFtbWVyLlBhbih7IGV2ZW50OiAndGlsdCcsIGRpcmVjdGlvbjogSGFtbWVyLkRJUkVDVElPTl9WRVJUSUNBTCwgcG9pbnRlcnM6IDIsIHRocmVzaG9sZDogMCB9KTtcclxuXHRcdGxldCB0b3VjaFJvdGF0ZSA9IG5ldyBIYW1tZXIuUm90YXRlKHsgZXZlbnQ6ICdyb3RhdGUnLCBwb2ludGVyczogMiwgdGhyZXNob2xkOiAxMCB9KTtcclxuXHRcdGxldCB0b3VjaFpvb20gPSBuZXcgSGFtbWVyLlBpbmNoKHsgZXZlbnQ6ICd6b29tJywgcG9pbnRlcnM6IDIsIHRocmVzaG9sZDogMCB9KTtcclxuXHJcblx0XHR0b3VjaFRpbHQucmVjb2duaXplV2l0aCh0b3VjaFJvdGF0ZSk7XHJcblx0XHR0b3VjaFRpbHQucmVjb2duaXplV2l0aCh0b3VjaFpvb20pO1xyXG5cdFx0dG91Y2hSb3RhdGUucmVjb2duaXplV2l0aCh0b3VjaFpvb20pO1xyXG5cclxuXHRcdHRoaXMuaGFtbWVyLmFkZCh0b3VjaFRhcCk7XHJcblx0XHR0aGlzLmhhbW1lci5hZGQodG91Y2hNb3ZlKTtcclxuXHRcdHRoaXMuaGFtbWVyLmFkZCh0b3VjaFRpbHQpO1xyXG5cdFx0dGhpcy5oYW1tZXIuYWRkKHRvdWNoUm90YXRlKTtcclxuXHRcdHRoaXMuaGFtbWVyLmFkZCh0b3VjaFpvb20pO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW5pdGlhbGl6ZXMgdGhlIHJvb3QtZWxlbWVudFxyXG5cdCAqL1xyXG5cdGluaXRpYWxpemVSb290RWxlbWVudCgpIHtcclxuXHRcdHRoaXMucm9vdEVsZW1lbnQuaW5uZXJIVE1MID0gXCJcIjtcclxuXHJcblx0XHRsZXQgb3V0ZXJEaXYgPSBodG1sVG9FbGVtZW50KGA8ZGl2IHN0eWxlPVwicG9zaXRpb246IHJlbGF0aXZlOyB3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlOyBvdmVyZmxvdzogaGlkZGVuO1wiPjwvZGl2PmApO1xyXG5cdFx0dGhpcy5yb290RWxlbWVudC5hcHBlbmRDaGlsZChvdXRlckRpdilcclxuXHRcdC8qdGhpcy5yb290RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50ID0+IHtcclxuXHRcdFx0bGV0IHJvb3RPZmZzZXQgPSBlbGVtZW50T2Zmc2V0KHRoaXMucm9vdEVsZW1lbnQpO1xyXG5cdFx0XHR0aGlzLmhhbmRsZU1hcEludGVyYWN0aW9uKG5ldyBWZWN0b3IyKFxyXG5cdFx0XHRcdCgoZXZlbnQucGFnZVggLSByb290T2Zmc2V0LnRvcCkgLyB0aGlzLnJvb3RFbGVtZW50LmNsaWVudFdpZHRoKSAqIDIgLSAxLFxyXG5cdFx0XHRcdC0oKGV2ZW50LnBhZ2VZIC0gcm9vdE9mZnNldC5sZWZ0KSAvIHRoaXMucm9vdEVsZW1lbnQuY2xpZW50SGVpZ2h0KSAqIDIgKyAxXHJcblx0XHRcdCkpO1xyXG5cdFx0fSk7Ki9cclxuXHRcdHRoaXMuaGFtbWVyLm9uKCd0YXAnLCBldmVudCA9PiB7XHJcblx0XHRcdGxldCByb290T2Zmc2V0ID0gZWxlbWVudE9mZnNldCh0aGlzLnJvb3RFbGVtZW50KTtcclxuXHRcdFx0dGhpcy5oYW5kbGVNYXBJbnRlcmFjdGlvbihuZXcgVmVjdG9yMihcclxuXHRcdFx0XHQoKGV2ZW50LmNlbnRlci54IC0gcm9vdE9mZnNldC50b3ApIC8gdGhpcy5yb290RWxlbWVudC5jbGllbnRXaWR0aCkgKiAyIC0gMSxcclxuXHRcdFx0XHQtKChldmVudC5jZW50ZXIueSAtIHJvb3RPZmZzZXQubGVmdCkgLyB0aGlzLnJvb3RFbGVtZW50LmNsaWVudEhlaWdodCkgKiAyICsgMVxyXG5cdFx0XHQpKTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdC8vIDNkLWNhbnZhc1xyXG5cdFx0b3V0ZXJEaXYuYXBwZW5kQ2hpbGQodGhpcy5yZW5kZXJlci5kb21FbGVtZW50KTtcclxuXHJcblx0XHQvLyBodG1sLW1hcmtlcnNcclxuXHRcdHRoaXMuY3NzMmRSZW5kZXJlci5kb21FbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcclxuXHRcdHRoaXMuY3NzMmRSZW5kZXJlci5kb21FbGVtZW50LnN0eWxlLnRvcCA9ICcwJztcclxuXHRcdHRoaXMuY3NzMmRSZW5kZXJlci5kb21FbGVtZW50LnN0eWxlLmxlZnQgPSAnMCc7XHJcblx0XHR0aGlzLmNzczJkUmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xyXG5cdFx0b3V0ZXJEaXYuYXBwZW5kQ2hpbGQodGhpcy5jc3MyZFJlbmRlcmVyLmRvbUVsZW1lbnQpO1xyXG5cclxuXHRcdC8vIHBlcmZvcm1hbmNlIG1vbml0b3JcclxuXHRcdG91dGVyRGl2LmFwcGVuZENoaWxkKHRoaXMuc3RhdHMuZG9tKTtcclxuXHJcblx0XHR0aGlzLmhhbmRsZUNvbnRhaW5lclJlc2l6ZSgpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgcmVuZGVyLXJlc29sdXRpb24gYW5kIGFzcGVjdCByYXRpbyBiYXNlZCBvbiB0aGUgc2l6ZSBvZiB0aGUgcm9vdC1lbGVtZW50XHJcblx0ICovXHJcblx0aGFuZGxlQ29udGFpbmVyUmVzaXplID0gKCkgPT4ge1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTaXplKHRoaXMucm9vdEVsZW1lbnQuY2xpZW50V2lkdGgsIHRoaXMucm9vdEVsZW1lbnQuY2xpZW50SGVpZ2h0KTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0UGl4ZWxSYXRpbyh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyAqIHRoaXMuc3VwZXJTYW1wbGluZ1ZhbHVlKTtcclxuXHJcblx0XHR0aGlzLmNzczJkUmVuZGVyZXIuc2V0U2l6ZSh0aGlzLnJvb3RFbGVtZW50LmNsaWVudFdpZHRoLCB0aGlzLnJvb3RFbGVtZW50LmNsaWVudEhlaWdodCk7XHJcblxyXG5cdFx0dGhpcy5jYW1lcmEuYXNwZWN0ID0gdGhpcy5yb290RWxlbWVudC5jbGllbnRXaWR0aCAvIHRoaXMucm9vdEVsZW1lbnQuY2xpZW50SGVpZ2h0O1xyXG5cdFx0dGhpcy5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xyXG5cdH07XHJcblxyXG5cdGhhbmRsZU1hcEludGVyYWN0aW9uKHNjcmVlblBvcywgaW50ZXJhY3Rpb25UeXBlID0gTWFwVmlld2VyLkludGVyYWN0aW9uVHlwZS5MRUZUQ0xJQ0spIHtcclxuXHRcdGlmICh0aGlzLm1hcCAmJiB0aGlzLm1hcC5pc0xvYWRlZCl7XHJcblx0XHRcdHRoaXMucmF5Y2FzdGVyLnNldEZyb21DYW1lcmEoc2NyZWVuUG9zLCB0aGlzLmNhbWVyYSk7XHJcblxyXG5cdFx0XHRsZXQgbG93cmVzTGF5ZXIgPSBuZXcgTGF5ZXJzKCk7XHJcblx0XHRcdGxvd3Jlc0xheWVyLnNldCgyKTtcclxuXHJcblx0XHRcdC8vIGNoZWNrIG1hcmtlciBpbnRlcmFjdGlvbnNcclxuXHRcdFx0bGV0IGludGVyc2VjdHMgPSB0aGlzLnJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3RzKFt0aGlzLm1hcC5zY2VuZSwgdGhpcy5tYXAubWFya2VyTWFuYWdlci5vYmplY3RNYXJrZXJTY2VuZV0sIHRydWUpO1xyXG5cdFx0XHRsZXQgY292ZXJlZCA9IGZhbHNlO1xyXG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGludGVyc2VjdHMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRpZiAoaW50ZXJzZWN0c1swXS5vYmplY3Qpe1xyXG5cdFx0XHRcdFx0bGV0IG1hcmtlciA9IGludGVyc2VjdHNbaV0ub2JqZWN0Lm1hcmtlcjtcclxuXHRcdFx0XHRcdGlmIChtYXJrZXIgJiYgbWFya2VyLl9vcGFjaXR5ID4gMCAmJiAoIWNvdmVyZWQgfHwgIW1hcmtlci5kZXB0aFRlc3QpKSB7XHJcblx0XHRcdFx0XHRcdG1hcmtlci5vbkNsaWNrKGludGVyc2VjdHNbaV0ucG9pbnRPbkxpbmUgfHwgaW50ZXJzZWN0c1tpXS5wb2ludCk7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIWludGVyc2VjdHNbaV0ub2JqZWN0LmxheWVycy50ZXN0KGxvd3Jlc0xheWVyKSkge1xyXG5cdFx0XHRcdFx0XHRjb3ZlcmVkID0gdHJ1ZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHR1cGRhdGVMb2FkZWRNYXBBcmVhID0gKCkgPT4ge1xyXG5cdFx0aWYgKCF0aGlzLm1hcCkgcmV0dXJuO1xyXG5cclxuXHRcdHRoaXMubWFwLmxvYWRNYXBBcmVhKHRoaXMubG9hZGVkQ2VudGVyLngsIHRoaXMubG9hZGVkQ2VudGVyLnksIHRoaXMubG9hZGVkSGlyZXNWaWV3RGlzdGFuY2UsIHRoaXMubG9hZGVkTG93cmVzVmlld0Rpc3RhbmNlKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSByZW5kZXItbG9vcCB0byB1cGRhdGUgYW5kIHBvc3NpYmx5IHJlbmRlciBhIG5ldyBmcmFtZS5cclxuXHQgKiBAcGFyYW0gbm93IHRoZSBjdXJyZW50IHRpbWUgaW4gbWlsbGlzZWNvbmRzXHJcblx0ICovXHJcblx0cmVuZGVyTG9vcCA9IChub3cpID0+IHtcclxuXHRcdHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLnJlbmRlckxvb3ApO1xyXG5cclxuXHRcdC8vIGNhbGN1bGF0ZSBkZWx0YSB0aW1lXHJcblx0XHRpZiAodGhpcy5sYXN0RnJhbWUgPD0gMCkgeyB0aGlzLmxhc3RGcmFtZSA9IG5vdzsgfVxyXG5cdFx0bGV0IGRlbHRhID0gbm93IC0gdGhpcy5sYXN0RnJhbWU7XHJcblx0XHR0aGlzLmxhc3RGcmFtZSA9IG5vdztcclxuXHJcblx0XHQvLyB1cGRhdGUgc3RhdHNcclxuXHRcdHRoaXMuc3RhdHMuYmVnaW4oKTtcclxuXHJcblx0XHQvLyB1cGRhdGUgY29udHJvbHNcclxuXHRcdGlmICh0aGlzLm1hcCAhPSBudWxsKSB7XHJcblx0XHRcdHRoaXMuY29udHJvbHNNYW5hZ2VyLnVwZGF0ZShkZWx0YSwgdGhpcy5tYXApO1xyXG5cdFx0XHR0aGlzLmNvbnRyb2xzTWFuYWdlci51cGRhdGVDYW1lcmEoKTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyByZW5kZXJcclxuXHRcdHRoaXMucmVuZGVyKGRlbHRhKTtcclxuXHJcblx0XHQvLyB1cGRhdGUgc3RhdHNcclxuXHRcdHRoaXMuc3RhdHMudXBkYXRlKCk7XHJcblx0fTtcclxuXHJcblx0LyoqXHJcblx0ICogUmVuZGVycyBhIGZyYW1lXHJcblx0ICovXHJcblx0cmVuZGVyKGRlbHRhKSB7XHJcblx0XHRkaXNwYXRjaEV2ZW50KHRoaXMuZXZlbnRzLCBcImJsdWVtYXBSZW5kZXJGcmFtZVwiLCB7XHJcblx0XHRcdGRlbHRhOiBkZWx0YSxcclxuXHRcdH0pO1xyXG5cclxuXHRcdC8vcHJlcGFyZSBjYW1lcmFcclxuXHRcdHRoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcclxuXHRcdHRoaXMuc2t5Ym94Q2FtZXJhLnJvdGF0aW9uLmNvcHkodGhpcy5jYW1lcmEucm90YXRpb24pO1xyXG5cdFx0dGhpcy5za3lib3hDYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xyXG5cclxuXHRcdC8vcmVuZGVyXHJcblx0XHR0aGlzLnJlbmRlcmVyLmNsZWFyKCk7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJlci5yZW5kZXIodGhpcy5za3lib3hTY2VuZSwgdGhpcy5za3lib3hDYW1lcmEpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5jbGVhckRlcHRoKCk7XHJcblxyXG5cdFx0LypcclxuXHRcdExheWVyczpcclxuXHRcdDAgLSBhbHdheXMgdmlzaWJsZSBvYmplY3RzXHJcblx0XHQxIC0gaGlyZXMgbGF5ZXJcclxuXHRcdDIgLSBsb3dyZXMgbGF5ZXJcclxuXHRcdCovXHJcblxyXG5cdFx0aWYgKHRoaXMubWFwICYmIHRoaXMubWFwLmlzTG9hZGVkKSB7XHJcblx0XHRcdC8vdXBkYXRlIHVuaWZvcm1zXHJcblx0XHRcdHRoaXMudW5pZm9ybXMuaGlyZXNUaWxlTWFwLnZhbHVlLnBvcy5jb3B5KHRoaXMubWFwLmhpcmVzVGlsZU1hbmFnZXIuY2VudGVyVGlsZSk7XHJcblxyXG5cdFx0XHR0aGlzLmNhbWVyYS5sYXllcnMuc2V0KDIpO1xyXG5cdFx0XHR0aGlzLnJlbmRlcmVyLnJlbmRlcih0aGlzLm1hcC5zY2VuZSwgdGhpcy5jYW1lcmEpO1xyXG5cdFx0XHR0aGlzLnJlbmRlcmVyLmNsZWFyRGVwdGgoKTtcclxuXHRcdFx0dGhpcy5jYW1lcmEubGF5ZXJzLnNldCgwKTtcclxuXHRcdFx0aWYgKHRoaXMuY29udHJvbHNNYW5hZ2VyLmRpc3RhbmNlIDwgMjAwMCkgdGhpcy5jYW1lcmEubGF5ZXJzLmVuYWJsZSgxKTtcclxuXHRcdFx0dGhpcy5yZW5kZXJlci5yZW5kZXIodGhpcy5tYXAuc2NlbmUsIHRoaXMuY2FtZXJhKTtcclxuXHRcdFx0dGhpcy5yZW5kZXJlci5yZW5kZXIodGhpcy5tYXAubWFya2VyTWFuYWdlci5vYmplY3RNYXJrZXJTY2VuZSwgdGhpcy5jYW1lcmEpO1xyXG5cclxuXHRcdFx0dGhpcy5jc3MyZFJlbmRlcmVyLnJlbmRlcih0aGlzLm1hcC5tYXJrZXJNYW5hZ2VyLmVsZW1lbnRNYXJrZXJTY2VuZSwgdGhpcy5jYW1lcmEpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2hhbmdlcyAvIFNldHMgdGhlIG1hcCB0aGF0IHdpbGwgYmUgbG9hZGVkIGFuZCBkaXNwbGF5ZWRcclxuXHQgKiBAcGFyYW0gbWFwXHJcblx0ICovXHJcblx0c2V0TWFwKG1hcCA9IG51bGwpIHtcclxuXHRcdGlmICh0aGlzLm1hcCAmJiB0aGlzLm1hcC5pc01hcCkgdGhpcy5tYXAudW5sb2FkKCk7XHJcblxyXG5cdFx0dGhpcy5tYXAgPSBtYXA7XHJcblxyXG5cdFx0aWYgKHRoaXMubWFwICYmIHRoaXMubWFwLmlzTWFwKSB7XHJcblx0XHRcdHJldHVybiBtYXAubG9hZChISVJFU19WRVJURVhfU0hBREVSLCBISVJFU19GUkFHTUVOVF9TSEFERVIsIExPV1JFU19WRVJURVhfU0hBREVSLCBMT1dSRVNfRlJBR01FTlRfU0hBREVSLCB0aGlzLnVuaWZvcm1zKVxyXG5cdFx0XHRcdC50aGVuKCgpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMuc2t5Ym94U2NlbmUuYW1iaWVudExpZ2h0ID0gbWFwLmFtYmllbnRMaWdodDtcclxuXHRcdFx0XHRcdHRoaXMuc2t5Ym94U2NlbmUuc2t5Q29sb3IgPSBtYXAuc2t5Q29sb3I7XHJcblxyXG5cdFx0XHRcdFx0dGhpcy51bmlmb3Jtcy5hbWJpZW50TGlnaHQudmFsdWUgPSBtYXAuYW1iaWVudExpZ2h0O1xyXG5cdFx0XHRcdFx0dGhpcy51bmlmb3Jtcy5oaXJlc1RpbGVNYXAudmFsdWUubWFwID0gbWFwLmhpcmVzVGlsZU1hbmFnZXIudGlsZU1hcC50ZXh0dXJlO1xyXG5cdFx0XHRcdFx0dGhpcy51bmlmb3Jtcy5oaXJlc1RpbGVNYXAudmFsdWUuc2NhbGUuc2V0KG1hcC5oaXJlcy50aWxlU2l6ZS54LCBtYXAuaGlyZXMudGlsZVNpemUueik7XHJcblx0XHRcdFx0XHR0aGlzLnVuaWZvcm1zLmhpcmVzVGlsZU1hcC52YWx1ZS50cmFuc2xhdGUuc2V0KG1hcC5oaXJlcy50cmFuc2xhdGUueCwgbWFwLmhpcmVzLnRyYW5zbGF0ZS56KTtcclxuXHJcblx0XHRcdFx0XHRzZXRUaW1lb3V0KHRoaXMudXBkYXRlTG9hZGVkTWFwQXJlYSk7XHJcblxyXG5cdFx0XHRcdFx0ZGlzcGF0Y2hFdmVudCh0aGlzLmV2ZW50cywgXCJibHVlbWFwTWFwQ2hhbmdlZFwiLCB7XHJcblx0XHRcdFx0XHRcdG1hcDogbWFwXHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9KVxyXG5cdFx0XHRcdC5jYXRjaChlcnJvciA9PiB7XHJcblx0XHRcdFx0XHRhbGVydCh0aGlzLmV2ZW50cywgZXJyb3IsIFwiZXJyb3JcIik7XHJcblx0XHRcdFx0fSk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRsb2FkTWFwQXJlYShjZW50ZXJYLCBjZW50ZXJaLCBoaXJlc1ZpZXdEaXN0YW5jZSA9IC0xLCBsb3dyZXNWaWV3RGlzdGFuY2UgPSAtMSkge1xyXG5cdFx0dGhpcy5sb2FkZWRDZW50ZXIuc2V0KGNlbnRlclgsIGNlbnRlclopO1xyXG5cdFx0aWYgKGhpcmVzVmlld0Rpc3RhbmNlID49IDApIHRoaXMubG9hZGVkSGlyZXNWaWV3RGlzdGFuY2UgPSBoaXJlc1ZpZXdEaXN0YW5jZTtcclxuXHRcdGlmIChsb3dyZXNWaWV3RGlzdGFuY2UgPj0gMCkgdGhpcy5sb2FkZWRMb3dyZXNWaWV3RGlzdGFuY2UgPSBsb3dyZXNWaWV3RGlzdGFuY2U7XHJcblxyXG5cdFx0dGhpcy51cGRhdGVMb2FkZWRNYXBBcmVhKCk7XHJcblx0fVxyXG5cclxuXHRnZXQgc3VwZXJTYW1wbGluZygpIHtcclxuXHRcdHJldHVybiB0aGlzLnN1cGVyU2FtcGxpbmdWYWx1ZTtcclxuXHR9XHJcblxyXG5cdHNldCBzdXBlclNhbXBsaW5nKHZhbHVlKSB7XHJcblx0XHR0aGlzLnN1cGVyU2FtcGxpbmdWYWx1ZSA9IHZhbHVlO1xyXG5cdFx0dGhpcy5oYW5kbGVDb250YWluZXJSZXNpemUoKTtcclxuXHR9XHJcblxyXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5cdC8qKlxyXG5cdCAqIEFwcGxpZXMgYSBsb2FkZWQgc2V0dGluZ3Mtb2JqZWN0IChzZXR0aW5ncy5qc29uKVxyXG5cdCAqIEBwYXJhbSBzZXR0aW5nc1xyXG5cdCAqL1xyXG5cdGFwcGx5U2V0dGluZ3Moc2V0dGluZ3MpIHtcclxuXHJcblx0XHQvLyByZXNldCBtYXBzXHJcblx0XHR0aGlzLm1hcHMuZm9yRWFjaChtYXAgPT4gbWFwLmRpc3Bvc2UoKSk7XHJcblx0XHR0aGlzLm1hcHMgPSBbXTtcclxuXHJcblx0XHQvLyBjcmVhdGUgbWFwc1xyXG5cdFx0aWYgKHNldHRpbmdzLm1hcHMgIT09IHVuZGVmaW5lZCl7XHJcblx0XHRcdGZvciAobGV0IG1hcElkIGluIHNldHRpbmdzLm1hcHMpIHtcclxuXHRcdFx0XHRpZiAoIXNldHRpbmdzLm1hcHMuaGFzT3duUHJvcGVydHkobWFwSWQpKSBjb250aW51ZTtcclxuXHJcblx0XHRcdFx0bGV0IG1hcFNldHRpbmdzID0gc2V0dGluZ3MubWFwc1ttYXBJZF07XHJcblx0XHRcdFx0aWYgKG1hcFNldHRpbmdzLmVuYWJsZWQpXHJcblx0XHRcdFx0XHR0aGlzLm1hcHMucHVzaChuZXcgTWFwKG1hcElkLCB0aGlzLmRhdGFVcmwgKyBtYXBJZCArIFwiL1wiLCB0aGlzLnJvb3RFbGVtZW50KSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvLyBzb3J0IG1hcHNcclxuXHRcdHRoaXMubWFwcy5zb3J0KChtYXAxLCBtYXAyKSA9PiB7XHJcblx0XHRcdGxldCBzb3J0ID0gc2V0dGluZ3MubWFwc1ttYXAxLmlkXS5vcmRpbmFsIC0gc2V0dGluZ3MubWFwc1ttYXAyLmlkXS5vcmRpbmFsO1xyXG5cdFx0XHRpZiAoaXNOYU4oc29ydCkpIHJldHVybiAwO1xyXG5cdFx0XHRyZXR1cm4gc29ydDtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHtGaWxlTG9hZGVyfSBmcm9tIFwidGhyZWVcIjtcclxuaW1wb3J0IHtNYXB9IGZyb20gXCIuL21hcC9NYXBcIjtcclxuXHJcbmV4cG9ydCB7IE1hcFZpZXdlciB9IGZyb20gXCIuL01hcFZpZXdlclwiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi91dGlsL1V0aWxzXCI7XHJcblxyXG4vKipcclxuICogTG9hZHMgYW5kIHJldHVybnMgYSBwcm9taXNlIHdpdGggYW4gYXJyYXkgb2YgTWFwcyBsb2FkZWQgZnJvbSB0aGF0IHJvb3QtcGF0aC48YnI+XHJcbiAqIDxiPkRPTlQgRk9SR0VUIFRPIGRpc3Bvc2UoKSBBTEwgTUFQUyBSRVRVUk5FRCBCWSBUSElTIE1FVEhPRCBJRiBZT1UgRE9OVCBORUVEIFRIRU0gQU5ZTU9SRSE8L2I+XHJcbiAqIEBwYXJhbSBkYXRhVXJsXHJcbiAqIEBwYXJhbSBldmVudHNcclxuICogQHJldHVybnMge1Byb21pc2U8TWFwW10+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGxvYWRNYXBzID0gKGRhdGFVcmwsIGV2ZW50cyA9IG51bGwpID0+IHtcclxuXHJcbiAgICBmdW5jdGlvbiBsb2FkU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgbGV0IGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCk7XHJcbiAgICAgICAgICAgIGxvYWRlci5zZXRSZXNwb25zZVR5cGUoXCJqc29uXCIpO1xyXG4gICAgICAgICAgICBsb2FkZXIubG9hZChkYXRhVXJsICsgXCJzZXR0aW5ncy5qc29uXCIsXHJcbiAgICAgICAgICAgICAgICByZXNvbHZlLFxyXG4gICAgICAgICAgICAgICAgKCkgPT4ge30sXHJcbiAgICAgICAgICAgICAgICAoKSA9PiByZWplY3QoXCJGYWlsZWQgdG8gbG9hZCB0aGUgc2V0dGluZ3MuanNvbiFcIilcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbG9hZFNldHRpbmdzKCkudGhlbihzZXR0aW5ncyA9PiB7XHJcbiAgICAgICAgbGV0IG1hcHMgPSBbXTtcclxuXHJcbiAgICAgICAgLy8gY3JlYXRlIG1hcHNcclxuICAgICAgICBpZiAoc2V0dGluZ3MubWFwcyAhPT0gdW5kZWZpbmVkKXtcclxuICAgICAgICAgICAgZm9yIChsZXQgbWFwSWQgaW4gc2V0dGluZ3MubWFwcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFzZXR0aW5ncy5tYXBzLmhhc093blByb3BlcnR5KG1hcElkKSkgY29udGludWU7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IG1hcFNldHRpbmdzID0gc2V0dGluZ3MubWFwc1ttYXBJZF07XHJcbiAgICAgICAgICAgICAgICBpZiAobWFwU2V0dGluZ3MuZW5hYmxlZClcclxuICAgICAgICAgICAgICAgICAgICBtYXBzLnB1c2gobmV3IE1hcChtYXBJZCwgZGF0YVVybCArIG1hcElkICsgXCIvXCIsIGV2ZW50cykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBzb3J0IG1hcHNcclxuICAgICAgICBtYXBzLnNvcnQoKG1hcDEsIG1hcDIpID0+IHtcclxuICAgICAgICAgICAgbGV0IHNvcnQgPSBzZXR0aW5ncy5tYXBzW21hcDEuaWRdLm9yZGluYWwgLSBzZXR0aW5ncy5tYXBzW21hcDIuaWRdLm9yZGluYWw7XHJcbiAgICAgICAgICAgIGlmIChpc05hTihzb3J0KSkgcmV0dXJuIDA7XHJcbiAgICAgICAgICAgIHJldHVybiBzb3J0O1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gbWFwcztcclxuICAgIH0pO1xyXG5cclxufVxyXG4iXSwibmFtZXMiOlsic3RyaW5nVG9JbWFnZSIsInN0cmluZyIsImltYWdlIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50TlMiLCJzcmMiLCJwYXRoRnJvbUNvb3JkcyIsIngiLCJ6IiwicGF0aCIsInNwbGl0TnVtYmVyVG9QYXRoIiwic3Vic3RyaW5nIiwibGVuZ3RoIiwibnVtIiwicyIsInBhcnNlSW50IiwidG9TdHJpbmciLCJpIiwiY2hhckF0IiwiaGFzaFRpbGUiLCJkaXNwYXRjaEV2ZW50IiwiZWxlbWVudCIsImV2ZW50IiwiZGV0YWlsIiwiQ3VzdG9tRXZlbnQiLCJhbGVydCIsIm1lc3NhZ2UiLCJsZXZlbCIsInByaW50VG9Db25zb2xlIiwiY29uc29sZSIsImxvZyIsIndhcm4iLCJlcnJvciIsImRlYnVnIiwiaHRtbFRvRWxlbWVudCIsImh0bWwiLCJ0ZW1wbGF0ZSIsImNyZWF0ZUVsZW1lbnQiLCJpbm5lckhUTUwiLCJ0cmltIiwiY29udGVudCIsImZpcnN0Q2hpbGQiLCJodG1sVG9FbGVtZW50cyIsImNoaWxkTm9kZXMiLCJhbmltYXRlIiwiYW5pbWF0aW9uRnJhbWUiLCJkdXJhdGlvbk1zIiwicG9zdEFuaW1hdGlvbiIsImFuaW1hdGlvbiIsImFuaW1hdGlvblN0YXJ0IiwibGFzdEZyYW1lIiwiY2FuY2VsbGVkIiwiZnJhbWUiLCJ0aW1lIiwicHJvZ3Jlc3MiLCJNYXRoVXRpbHMiLCJjbGFtcCIsImRlbHRhVGltZSIsIndpbmRvdyIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsImNhbmNlbCIsImVsZW1lbnRPZmZzZXQiLCJyZWN0IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0Iiwic2Nyb2xsTGVmdCIsInBhZ2VYT2Zmc2V0IiwiZG9jdW1lbnRFbGVtZW50Iiwic2Nyb2xsVG9wIiwicGFnZVlPZmZzZXQiLCJ0b3AiLCJsZWZ0IiwiVGlsZSIsIm9uTG9hZCIsIm9uVW5sb2FkIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJ2YWx1ZSIsIm1vZGVsIiwidW5sb2FkZWQiLCJsb2FkaW5nIiwibG9hZCIsInRpbGVMb2FkZXIiLCJ1bmxvYWQiLCJ0aGVuIiwiZ2VvbWV0cnkiLCJkaXNwb3NlIiwiZmluYWxseSIsIlRpbGVNYXAiLCJ3aWR0aCIsImhlaWdodCIsImNhbnZhcyIsInRpbGVNYXBDb250ZXh0IiwiZ2V0Q29udGV4dCIsImFscGhhIiwid2lsbFJlYWRGcmVxdWVudGx5IiwidGV4dHVyZSIsIlRleHR1cmUiLCJnZW5lcmF0ZU1pcG1hcHMiLCJtYWdGaWx0ZXIiLCJMaW5lYXJGaWx0ZXIiLCJtaW5GaWx0ZXIiLCJ3cmFwUyIsIkNsYW1wVG9FZGdlV3JhcHBpbmciLCJ3cmFwVCIsImZsaXBZIiwibmVlZHNVcGRhdGUiLCJzZXRBbGwiLCJzdGF0ZSIsImZpbGxTdHlsZSIsImZpbGxSZWN0Iiwic2V0VGlsZSIsIkVNUFRZIiwiTE9BREVEIiwiVGlsZU1hbmFnZXIiLCJzY2VuZSIsIm9uVGlsZUxvYWQiLCJvblRpbGVVbmxvYWQiLCJldmVudHMiLCJsb2FkQ2xvc2VUaWxlcyIsImxvYWROZXh0VGlsZSIsImxvYWRUaW1lb3V0IiwiY2xlYXJUaW1lb3V0IiwiY3VycmVudGx5TG9hZGluZyIsInNldFRpbWVvdXQiLCJoYW5kbGVMb2FkZWRUaWxlIiwidGlsZSIsImFkZCIsImhhbmRsZVVubG9hZGVkVGlsZSIsInRpbGVNYXAiLCJjZW50ZXJUaWxlIiwidGlsZU1hcEhhbGZTaXplIiwieSIsInJlbW92ZSIsInZpZXdEaXN0YW5jZVgiLCJ2aWV3RGlzdGFuY2VaIiwiVmVjdG9yMiIsInRpbGVzIiwidGlsZU1hcFNpemUiLCJsb2FkQXJvdW5kVGlsZSIsInNldCIsInJlbW92ZUZhclRpbGVzIiwia2V5cyIsImhhc093blByb3BlcnR5IiwicmVtb3ZlQWxsVGlsZXMiLCJkIiwibSIsIk1hdGgiLCJtYXgiLCJ0cnlMb2FkVGlsZSIsImFicyIsInRpbGVIYXNoIiwidW5kZWZpbmVkIiwiY2F0Y2giLCJzdGF0dXMiLCJ0YXJnZXQiLCJUaWxlTG9hZGVyIiwidGlsZVBhdGgiLCJtYXRlcmlhbCIsInRpbGVTZXR0aW5ncyIsImxheWVyIiwidGlsZVgiLCJ0aWxlWiIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiZmlsZUxvYWRlciIsImdlb21ldHJ5SnNvbiIsInR5cGUiLCJidWZmZXJHZW9tZXRyeUxvYWRlciIsInBhcnNlIiwib2JqZWN0IiwiTWVzaCIsImxheWVycyIsInRpbGVTaXplIiwidHJhbnNsYXRlIiwic2NhbGUiLCJwb3NpdGlvbiIsInVwZGF0ZU1hdHJpeFdvcmxkIiwiRmlsZUxvYWRlciIsInNldFJlc3BvbnNlVHlwZSIsIkJ1ZmZlckdlb21ldHJ5TG9hZGVyIiwiTWFya2VyIiwibWFya2VyU2V0IiwiaWQiLCJtYW5hZ2VyIiwiX3Bvc2l0aW9uIiwiVmVjdG9yMyIsIl9sYWJlbCIsImxpbmsiLCJuZXdUYWIiLCJtaW5EaXN0YW5jZSIsIm1heERpc3RhbmNlIiwib3BhY2l0eSIsIl9zb3VyY2UiLCJTb3VyY2UiLCJDVVNUT00iLCJfb25EaXNwb3NhbCIsIl9kaXN0YW5jZSIsIl9vcGFjaXR5IiwiX3Bvc1JlbGF0aXZlVG9DYW1lcmEiLCJfY2FtZXJhRGlyZWN0aW9uIiwidXBkYXRlIiwibWFya2VyRGF0YSIsIk1BUktFUl9GSUxFIiwic2V0UG9zaXRpb24iLCJwYXJzZUZsb2F0IiwibGFiZWwiLCJvbkNsaWNrIiwiY2xpY2tQb3NpdGlvbiIsIm1hcmtlciIsImZvbGxvd0xpbmsiLCJzaG93UG9wdXAiLCJvcGVuIiwibG9jYXRpb24iLCJocmVmIiwiX29uQmVmb3JlUmVuZGVyIiwicmVuZGVyZXIiLCJjYW1lcmEiLCJzdWJWZWN0b3JzIiwiZ2V0V29ybGREaXJlY3Rpb24iLCJkb3QiLCJtaW4iLCJibGVuZEluIiwiYmxlbmRPdXQiLCJzdGFydE9wYWNpdHkiLCJmb3JFYWNoIiwiY2FsbGJhY2siLCJfbWFya2VyIiwibm9ybWFsaXplQ29sb3IiLCJjb2xvciIsInIiLCJub3JtYWxpc2VOdW1iZXIiLCJnIiwiYiIsImEiLCJyZ2IiLCJ2ZWM0IiwiVmVjdG9yNCIsIm5yIiwiZGVmIiwiaW50ZWdlciIsImlzTmFOIiwiZmxvb3IiLCJwdXNoIiwiVW5pZm9ybXNMaWIiLCJsaW5lIiwibGluZXdpZHRoIiwicmVzb2x1dGlvbiIsImRhc2hTY2FsZSIsImRhc2hTaXplIiwiZ2FwU2l6ZSIsIlNoYWRlckxpYiIsInVuaWZvcm1zIiwiVW5pZm9ybXNVdGlscyIsIm1lcmdlIiwiY29tbW9uIiwiZm9nIiwidmVydGV4U2hhZGVyIiwiZnJhZ21lbnRTaGFkZXIiLCJMaW5lTWF0ZXJpYWwiLCJwYXJhbWV0ZXJzIiwiU2hhZGVyTWF0ZXJpYWwiLCJjYWxsIiwiY2xvbmUiLCJjbGlwcGluZyIsImRhc2hlZCIsImRlZmluZVByb3BlcnRpZXMiLCJlbnVtZXJhYmxlIiwiZ2V0IiwiZGlmZnVzZSIsImNvcHkiLCJzZXRWYWx1ZXMiLCJwcm90b3R5cGUiLCJjcmVhdGUiLCJjb25zdHJ1Y3RvciIsImlzTGluZU1hdGVyaWFsIiwiTGluZVNlZ21lbnRzR2VvbWV0cnkiLCJJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSIsInBvc2l0aW9ucyIsInV2cyIsImluZGV4Iiwic2V0SW5kZXgiLCJzZXRBdHRyaWJ1dGUiLCJGbG9hdDMyQnVmZmVyQXR0cmlidXRlIiwiYXNzaWduIiwiaXNMaW5lU2VnbWVudHNHZW9tZXRyeSIsImFwcGx5TWF0cml4NCIsIm1hdHJpeCIsInN0YXJ0IiwiYXR0cmlidXRlcyIsImluc3RhbmNlU3RhcnQiLCJlbmQiLCJpbnN0YW5jZUVuZCIsImJvdW5kaW5nQm94IiwiY29tcHV0ZUJvdW5kaW5nQm94IiwiYm91bmRpbmdTcGhlcmUiLCJjb21wdXRlQm91bmRpbmdTcGhlcmUiLCJzZXRQb3NpdGlvbnMiLCJhcnJheSIsImxpbmVTZWdtZW50cyIsIkZsb2F0MzJBcnJheSIsIkFycmF5IiwiaXNBcnJheSIsImluc3RhbmNlQnVmZmVyIiwiSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIiLCJJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSIsInNldENvbG9ycyIsImNvbG9ycyIsImluc3RhbmNlQ29sb3JCdWZmZXIiLCJmcm9tV2lyZWZyYW1lR2VvbWV0cnkiLCJmcm9tRWRnZXNHZW9tZXRyeSIsImZyb21NZXNoIiwibWVzaCIsIldpcmVmcmFtZUdlb21ldHJ5IiwiZnJvbUxpbmVTZWdtZW50cyIsImlzR2VvbWV0cnkiLCJ2ZXJ0aWNlcyIsImlzQnVmZmVyR2VvbWV0cnkiLCJib3giLCJCb3gzIiwic2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSIsInVuaW9uIiwidmVjdG9yIiwiU3BoZXJlIiwiY2VudGVyIiwiZ2V0Q2VudGVyIiwibWF4UmFkaXVzU3EiLCJpbCIsImNvdW50IiwiZnJvbUJ1ZmZlckF0dHJpYnV0ZSIsImRpc3RhbmNlVG9TcXVhcmVkIiwicmFkaXVzIiwic3FydCIsInRvSlNPTiIsImFwcGx5TWF0cml4IiwiTGluZUdlb21ldHJ5IiwiaXNMaW5lR2VvbWV0cnkiLCJwb2ludHMiLCJmcm9tTGluZSIsIkxpbmVTZWdtZW50czIiLCJyYW5kb20iLCJpc0xpbmVTZWdtZW50czIiLCJjb21wdXRlTGluZURpc3RhbmNlcyIsImxpbmVEaXN0YW5jZXMiLCJkYXRhIiwiaiIsImwiLCJkaXN0YW5jZVRvIiwiaW5zdGFuY2VEaXN0YW5jZUJ1ZmZlciIsInJheWNhc3QiLCJzc09yaWdpbiIsInNzT3JpZ2luMyIsIm12TWF0cml4IiwiTWF0cml4NCIsIkxpbmUzIiwiY2xvc2VzdFBvaW50IiwicmF5Y2FzdGVyIiwiaW50ZXJzZWN0cyIsInRocmVzaG9sZCIsInBhcmFtcyIsIkxpbmUyIiwicmF5IiwicHJvamVjdGlvbk1hdHJpeCIsImxpbmVXaWR0aCIsImF0IiwidyIsIm1hdHJpeFdvcmxkSW52ZXJzZSIsIm11bHRpcGx5U2NhbGFyIiwibWF0cml4V29ybGQiLCJtdWx0aXBseU1hdHJpY2VzIiwiaXNCZWhpbmRDYW1lcmFOZWFyIiwiaXNQYXN0Q2FtZXJhRmFyIiwicGFyYW0iLCJjbG9zZXN0UG9pbnRUb1BvaW50UGFyYW1ldGVyIiwielBvcyIsImxlcnAiLCJpc0luQ2xpcFNwYWNlIiwiaXNJbnNpZGUiLCJwb2ludE9uTGluZSIsInBvaW50IiwiZGlzdGFuY2VTcVRvU2VnbWVudCIsImRpc3RhbmNlIiwib3JpZ2luIiwiZmFjZSIsImZhY2VJbmRleCIsInV2IiwidXYyIiwiaXNMaW5lMiIsIk1BUktFUl9GSUxMX0ZSQUdNRU5UX1NIQURFUiIsIlNoYWRlckNodW5rIiwibG9nZGVwdGhidWZfcGFyc19mcmFnbWVudCIsImxvZ2RlcHRoYnVmX2ZyYWdtZW50IiwiTUFSS0VSX0ZJTExfVkVSVEVYX1NIQURFUiIsImxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4IiwibG9nZGVwdGhidWZfdmVydGV4IiwiU2hhcGVNYXJrZXIiLCJwYXJlbnRPYmplY3QiLCJmaWxsQ29sb3IiLCJib3JkZXJDb2xvciIsImRlcHRoVGVzdCIsIl9saW5lT3BhY2l0eSIsIl9maWxsT3BhY2l0eSIsIl9tYXJrZXJPYmplY3QiLCJPYmplY3QzRCIsIl9tYXJrZXJGaWxsTWF0ZXJpYWwiLCJzaWRlIiwiRG91YmxlU2lkZSIsInRyYW5zcGFyZW50IiwibWFya2VyQ29sb3IiLCJfbWFya2VyTGluZU1hdGVyaWFsIiwiQ29sb3IiLCJ2ZXJ0ZXhDb2xvcnMiLCJpbm5lcldpZHRoIiwiaW5uZXJIZWlnaHQiLCJzaGFwZSIsInBhcmVudCIsImNoaWxkcmVuIiwiY2hpbGQiLCJjbGVhciIsInNldEhleCIsInRlc3QiLCJwb2ludHMzZCIsImxpbmVHZW8iLCJvbkJlZm9yZVJlbmRlciIsImdldFNpemUiLCJTaGFwZSIsImZpbGxHZW8iLCJTaGFwZUJ1ZmZlckdlb21ldHJ5Iiwicm90YXRlWCIsIlBJIiwiZmlsbCIsIm9sZEhvb2siLCJncm91cCIsIkxpbmVNYXJrZXIiLCJsaW5lQ29sb3IiLCJFeHRydWRlTWFya2VyIiwibWluSGVpZ2h0IiwibWF4SGVpZ2h0IiwiX21pbkhlaWdodCIsIm1heFkiLCJtaW5ZIiwiZGVwdGgiLCJwcmVSZW5kZXJIb29rIiwidG9wTGluZUdlbyIsInRvcExpbmUiLCJib3R0b21MaW5lIiwicG9pbnRMaW5lR2VvIiwicG9pbnRMaW5lIiwiRXh0cnVkZUJ1ZmZlckdlb21ldHJ5Iiwic3RlcHMiLCJiZXZlbEVuYWJsZWQiLCJDU1MyRE9iamVjdCIsInN0eWxlIiwiYW5jaG9yIiwiYWRkRXZlbnRMaXN0ZW5lciIsInRyYXZlcnNlIiwiRWxlbWVudCIsInBhcmVudE5vZGUiLCJyZW1vdmVDaGlsZCIsIkNTUzJEUmVuZGVyZXIiLCJfdGhpcyIsIl93aWR0aCIsIl9oZWlnaHQiLCJfd2lkdGhIYWxmIiwiX2hlaWdodEhhbGYiLCJ2aWV3TWF0cml4Iiwidmlld1Byb2plY3Rpb25NYXRyaXgiLCJjYWNoZSIsIm9iamVjdHMiLCJXZWFrTWFwIiwiZG9tRWxlbWVudCIsIm92ZXJmbG93Iiwic2V0U2l6ZSIsInJlbmRlck9iamVjdCIsInNldEZyb21NYXRyaXhQb3NpdGlvbiIsIldlYmtpdFRyYW5zZm9ybSIsIk1velRyYW5zZm9ybSIsIm9UcmFuc2Zvcm0iLCJ0cmFuc2Zvcm0iLCJkaXNwbGF5IiwidmlzaWJsZSIsIm9iamVjdERhdGEiLCJkaXN0YW5jZVRvQ2FtZXJhU3F1YXJlZCIsImdldERpc3RhbmNlVG9TcXVhcmVkIiwiYXBwZW5kQ2hpbGQiLCJvbkFmdGVyUmVuZGVyIiwib2JqZWN0MSIsIm9iamVjdDIiLCJmaWx0ZXJBbmRGbGF0dGVuIiwicmVzdWx0Iiwiek9yZGVyIiwic29ydGVkIiwic29ydCIsImRpc3RhbmNlQSIsImRpc3RhbmNlQiIsInpNYXgiLCJ6SW5kZXgiLCJyZW5kZXIiLCJhdXRvVXBkYXRlIiwiSFRNTE1hcmtlciIsIl9tYXJrZXJFbGVtZW50Iiwic2V0QW5jaG9yIiwicm91bmQiLCJwb2ludGVyRXZlbnRzIiwiUE9JTWFya2VyIiwiY2xhc3NMaXN0IiwiaWNvbiIsImljb25BbmNob3IiLCJvblJlbW92ZUxhYmVsIiwib25jZSIsInVwZGF0ZUh0bWwiLCJsYWJlbEh0bWwiLCJfaWNvbiIsIlBsYXllck1hcmtlciIsInBsYXllclV1aWQiLCJfbmFtZSIsIl9oZWFkIiwibmFtZSIsImhlYWRJbWFnZSIsIk1hcmtlclNldCIsIm1hcElkIiwiX21hcElkIiwiX29iamVjdE1hcmtlck9iamVjdCIsIl9lbGVtZW50TWFya2VyT2JqZWN0IiwidG9nZ2xlYWJsZSIsImRlZmF1bHRIaWRlIiwibWFya2VyU2V0RGF0YSIsInByZXZNYXJrZXJzIiwibWFya2VySWQiLCJtYXAiLCJ1cGRhdGVNYXJrZXIiLCJpc01hcmtlciIsIm1hcmtlclR5cGUiLCJjcmVhdGVNYXJrZXIiLCJjcmVhdGVQbGF5ZXJNYXJrZXIiLCJtYXJrZXJTZXRzIiwidmFsdWVzIiwiTWFya2VyTWFuYWdlciIsIm1hcmtlckZpbGVVcmwiLCJvYmplY3RNYXJrZXJTY2VuZSIsIlNjZW5lIiwiZWxlbWVudE1hcmtlclNjZW5lIiwiX3BvcHVwSWQiLCJsb2FkTWFya2Vyc0ZpbGUiLCJtYXJrZXJzRmlsZSIsInByZXZNYXJrZXJTZXRzIiwibWFya2VyU2V0SWQiLCJ1cGRhdGVNYXJrZXJTZXQiLCJpc01hcmtlclNldCIsInJlYXNvbiIsImNyZWF0ZU1hcmtlclNldCIsInNldHMiLCJhdXRvUmVtb3ZlIiwib25SZW1vdmFsIiwib25EaXNwb3NhbCIsIm9uUmVtb3ZlIiwiZmluaXNoZWQiLCJsb2FkZXIiLCJtYXJrZXJGaWxlIiwiTWFwIiwiZGF0YVVybCIsIndvcmxkIiwic3RhcnRQb3MiLCJza3lDb2xvciIsImFtYmllbnRMaWdodCIsImhpcmVzIiwibG93cmVzIiwiUmF5Y2FzdGVyIiwiaGlyZXNNYXRlcmlhbCIsImxvd3Jlc01hdGVyaWFsIiwibG9hZGVkVGV4dHVyZXMiLCJoaXJlc1RpbGVNYW5hZ2VyIiwibG93cmVzVGlsZU1hbmFnZXIiLCJtYXJrZXJNYW5hZ2VyIiwiaGlyZXNWZXJ0ZXhTaGFkZXIiLCJoaXJlc0ZyYWdtZW50U2hhZGVyIiwibG93cmVzVmVydGV4U2hhZGVyIiwibG93cmVzRnJhZ21lbnRTaGFkZXIiLCJzZXR0aW5nc0ZpbGVQcm9taXNlIiwibG9hZFNldHRpbmdzRmlsZSIsInRleHR1cmVGaWxlUHJvbWlzZSIsImxvYWRUZXh0dXJlc0ZpbGUiLCJtYXJrZXJVcGRhdGVQcm9taXNlIiwiY3JlYXRlTG93cmVzTWF0ZXJpYWwiLCJzZXR0aW5nc1Byb21pc2UiLCJ3b3JsZFNldHRpbmdzIiwibWFwUHJvbWlzZSIsImFsbCIsInRleHR1cmVzIiwiRXJyb3IiLCJjcmVhdGVIaXJlc01hdGVyaWFsIiwibG9hZE1hcEFyZWEiLCJoaXJlc1ZpZXdEaXN0YW5jZSIsImxvd3Jlc1ZpZXdEaXN0YW5jZSIsImlzTG9hZGVkIiwiaGlyZXNYIiwiaGlyZXNaIiwiaGlyZXNWaWV3WCIsImhpcmVzVmlld1oiLCJsb3dyZXNYIiwibG93cmVzWiIsImxvd3Jlc1ZpZXdYIiwibG93cmVzVmlld1oiLCJzZXR0aW5ncyIsIm1hcHMiLCJtYXRlcmlhbHMiLCJ0ZXh0dXJlU2V0dGluZ3MiLCJvcGFxdWUiLCJhbmlzb3Ryb3B5IiwiTmVhcmVzdEZpbHRlciIsIk5lYXJlc3RNaXBNYXBMaW5lYXJGaWx0ZXIiLCJmbGF0U2hhZGluZyIsInRleHR1cmVJbWFnZSIsImRlcHRoV3JpdGUiLCJWZXJ0ZXhDb2xvcnMiLCJGcm9udFNpZGUiLCJ3aXJlZnJhbWUiLCJ0ZXJyYWluSGVpZ2h0QXQiLCJuZWFyIiwiZmFyIiwiZW5hYmxlQWxsIiwiaGlyZXNUaWxlSGFzaCIsImxvd3Jlc1RpbGVIYXNoIiwiaW50ZXJzZWN0T2JqZWN0cyIsImVyciIsIlNLWV9GUkFHTUVOVF9TSEFERVIiLCJTS1lfVkVSVEVYX1NIQURFUiIsIlNreWJveFNjZW5lIiwiVU5JRk9STV9zdW5saWdodCIsIlVOSUZPUk1fc2t5Q29sb3IiLCJVTklGT1JNX2FtYmllbnRMaWdodCIsIlNwaGVyZUdlb21ldHJ5Iiwic3VubGlnaHQiLCJCYWNrU2lkZSIsInNreWJveCIsInN0cmVuZ3RoIiwiQ29udHJvbHNNYW5hZ2VyIiwibWFwVmlld2VyIiwicG9zaXRpb25WYWx1ZSIsInJvdGF0aW9uVmFsdWUiLCJhbmdsZVZhbHVlIiwiZGlzdGFuY2VWYWx1ZSIsIm9ydGhvVmFsdWUiLCJ2YWx1ZUNoYW5nZWQiLCJsYXN0TWFwVXBkYXRlUG9zaXRpb24iLCJjb250cm9sc1ZhbHVlIiwidXBkYXRlQ2FtZXJhIiwicm90YXRhYmxlQW5nbGUiLCJyb3RhdGFibGVEaXN0YW5jZSIsInBvdyIsInJvdGF0aW9uVmVjdG9yIiwic2luIiwiY29zIiwiYW5nbGVSb3RhdGlvbkF4aXMiLCJjcm9zcyIsImFwcGx5QXhpc0FuZ2xlIiwic3ViIiwibG9va0F0Iiwib3J0aG8iLCJjb250cm9sc01hbmFnZXIiLCJ0cmlnZ2VyRGlzdGFuY2UiLCJsb2FkZWRIaXJlc1ZpZXdEaXN0YW5jZSIsImhhbmRsZVZhbHVlQ2hhbmdlIiwicm90YXRpb24iLCJhbmdsZSIsImNvbnRyb2xzIiwic3RvcCIsIk1hcENvbnRyb2xzIiwicm9vdEVsZW1lbnQiLCJoYW1tZXJMaWIiLCJvbktleURvd24iLCJldnQiLCJrZXkiLCJrZXlDb2RlIiwiYWN0aW9uIiwiS0VZUyIsImluY2x1ZGVzIiwia2V5U3RhdGVzIiwib25LZXlVcCIsIm9uV2hlZWwiLCJkZWx0YSIsImRlbHRhWSIsImRlbHRhTW9kZSIsIldoZWVsRXZlbnQiLCJET01fREVMVEFfUElYRUwiLCJET01fREVMVEFfTElORSIsInRhcmdldERpc3RhbmNlIiwidXBkYXRlWm9vbSIsIm9uTW91c2VEb3duIiwiU1RBVEVTIiwiTk9ORSIsIkJVVFRPTlMiLCJNT1ZFIiwiYnV0dG9uIiwicHJldmVudERlZmF1bHQiLCJPUkJJVCIsIm9uTW91c2VNb3ZlIiwibW91c2UiLCJjbGllbnRYIiwiY2xpZW50WSIsIm9uTW91c2VVcCIsIm9uVG91Y2hEb3duIiwicG9pbnRlclR5cGUiLCJ0b3VjaFN0YXJ0IiwidGFyZ2V0UG9zaXRpb24iLCJvblRvdWNoTW92ZSIsInRvdWNoRGVsdGEiLCJkZWx0YVgiLCJyb3RhdGVBcm91bmQiLCJWRUNUT1IyX1pFUk8iLCJjbGllbnRIZWlnaHQiLCJvblRvdWNoVXAiLCJvblRvdWNoVGlsdERvd24iLCJ0b3VjaFRpbHRTdGFydCIsInRhcmdldEFuZ2xlIiwib25Ub3VjaFRpbHRNb3ZlIiwibWluQW5nbGUiLCJtYXhBbmdsZUZvclpvb20iLCJvblRvdWNoVGlsdFVwIiwib25Ub3VjaFJvdGF0ZURvd24iLCJsYXN0VG91Y2hSb3RhdGlvbiIsIm9uVG91Y2hSb3RhdGVNb3ZlIiwidGFyZ2V0Um90YXRpb24iLCJ3cmFwUm90YXRpb24iLCJvblRvdWNoUm90YXRlVXAiLCJvblRvdWNoWm9vbURvd24iLCJ0b3VjaFpvb21TdGFydCIsIm9uVG91Y2hab29tTW92ZSIsIm9uQ29udGV4dE1lbnUiLCJoYW1tZXIiLCJwb3NpdGlvblRlcnJhaW5IZWlnaHQiLCJtYXhBbmdsZSIsImxhc3RNb3VzZSIsInBhc3NpdmUiLCJvbiIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJvZmYiLCJkZWx0YU1vdXNlIiwibW92ZURlbHRhIiwiWk9PTV9JTiIsIlpPT01fT1VUIiwiVVAiLCJET1dOIiwiTEVGVCIsIlJJR0hUIiwidXBkYXRlUG9zaXRpb25UZXJyYWluSGVpZ2h0Iiwic29tZXRoaW5nQ2hhbmdlZCIsImRlbHRhUG9zaXRpb24iLCJkZWx0YVJvdGF0aW9uIiwiZGVsdGFBbmdsZSIsImRlbHRhRGlzdGFuY2UiLCJtaW5DYW1lcmFIZWlnaHQiLCJ1cGRhdGVNYXhBbmdsZUZvclpvb20iLCJNT1VTRSIsIlN0YXRzIiwibW9kZSIsImNvbnRhaW5lciIsImNzc1RleHQiLCJzaG93UGFuZWwiLCJhZGRQYW5lbCIsInBhbmVsIiwiZG9tIiwiaGlkZSIsImJlZ2luVGltZSIsInBlcmZvcm1hbmNlIiwiRGF0ZSIsIm5vdyIsInByZXZUaW1lIiwiZnJhbWVzIiwicHJldkZyYW1lVGltZSIsImZwc1BhbmVsIiwiUGFuZWwiLCJtc1BhbmVsIiwibGFzdEZyYW1lTXNQYW5lbCIsIm1lbVBhbmVsIiwic2VsZiIsIm1lbW9yeSIsIlJFVklTSU9OIiwiYmVnaW4iLCJ1c2VkSlNIZWFwU2l6ZSIsImpzSGVhcFNpemVMaW1pdCIsInNldE1vZGUiLCJmZyIsImJnIiwiSW5maW5pdHkiLCJQUiIsImRldmljZVBpeGVsUmF0aW8iLCJXSURUSCIsIkhFSUdIVCIsIlRFWFRfWCIsIlRFWFRfWSIsIkdSQVBIX1giLCJHUkFQSF9ZIiwiR1JBUEhfV0lEVEgiLCJHUkFQSF9IRUlHSFQiLCJjb250ZXh0IiwiZm9udCIsInRleHRCYXNlbGluZSIsImZpbGxUZXh0IiwiZ2xvYmFsQWxwaGEiLCJtYXhWYWx1ZSIsImRyYXdJbWFnZSIsIkhJUkVTX1ZFUlRFWF9TSEFERVIiLCJISVJFU19GUkFHTUVOVF9TSEFERVIiLCJMT1dSRVNfVkVSVEVYX1NIQURFUiIsIkxPV1JFU19GUkFHTUVOVF9TSEFERVIiLCJDb21iaW5lZENhbWVyYSIsImZvdiIsImFzcGVjdCIsInVwZGF0ZVByb2plY3Rpb25NYXRyaXgiLCJvcnRvZ3JhcGhpY1Byb2plY3Rpb24iLCJwZXJzcGVjdGl2ZVByb2plY3Rpb24iLCJ0YW4iLCJERUcyUkFEIiwiem9vbSIsInZpZXciLCJlbmFibGVkIiwiZnVsbFdpZHRoIiwiZnVsbEhlaWdodCIsIm9mZnNldFgiLCJvZmZzZXRZIiwic2tldyIsImZpbG1PZmZzZXQiLCJnZXRGaWxtV2lkdGgiLCJub3JtYWxpemVkT3J0aG8iLCJvcnRob1RvcCIsIm9ydGhvSGVpZ2h0Iiwib3J0aG9XaWR0aCIsIm9ydGhvTGVmdCIsIm1ha2VQZXJzcGVjdGl2ZSIsIm1ha2VPcnRob2dyYXBoaWMiLCJlbGVtZW50cyIsInByb2plY3Rpb25NYXRyaXhJbnZlcnNlIiwiaW52ZXJ0IiwiaXNQZXJzcGVjdGl2ZUNhbWVyYSIsIlBlcnNwZWN0aXZlQ2FtZXJhIiwiTWFwVmlld2VyIiwibGl2ZUFwaVVybCIsImhhbmRsZUNvbnRhaW5lclJlc2l6ZSIsImNsaWVudFdpZHRoIiwic2V0UGl4ZWxSYXRpbyIsInN1cGVyU2FtcGxpbmdWYWx1ZSIsImNzczJkUmVuZGVyZXIiLCJ1cGRhdGVMb2FkZWRNYXBBcmVhIiwibG9hZGVkQ2VudGVyIiwibG9hZGVkTG93cmVzVmlld0Rpc3RhbmNlIiwicmVuZGVyTG9vcCIsInN0YXRzIiwic3VubGlnaHRTdHJlbmd0aCIsImhpcmVzVGlsZU1hcCIsInNpemUiLCJwb3MiLCJXZWJHTFJlbmRlcmVyIiwiYW50aWFsaWFzIiwic29ydE9iamVjdHMiLCJwcmVzZXJ2ZURyYXdpbmdCdWZmZXIiLCJsb2dhcml0aG1pY0RlcHRoQnVmZmVyIiwiYXV0b0NsZWFyIiwic2t5Ym94U2NlbmUiLCJza3lib3hDYW1lcmEiLCJIYW1tZXIiLCJNYW5hZ2VyIiwiaW5pdGlhbGl6ZUhhbW1lciIsImluaXRpYWxpemVSb290RWxlbWVudCIsInRvdWNoVGFwIiwiVGFwIiwicG9pbnRlcnMiLCJ0YXBzIiwidG91Y2hNb3ZlIiwiUGFuIiwiZGlyZWN0aW9uIiwiRElSRUNUSU9OX0FMTCIsInRvdWNoVGlsdCIsIkRJUkVDVElPTl9WRVJUSUNBTCIsInRvdWNoUm90YXRlIiwiUm90YXRlIiwidG91Y2hab29tIiwiUGluY2giLCJyZWNvZ25pemVXaXRoIiwib3V0ZXJEaXYiLCJyb290T2Zmc2V0IiwiaGFuZGxlTWFwSW50ZXJhY3Rpb24iLCJzY3JlZW5Qb3MiLCJpbnRlcmFjdGlvblR5cGUiLCJJbnRlcmFjdGlvblR5cGUiLCJMRUZUQ0xJQ0siLCJzZXRGcm9tQ2FtZXJhIiwibG93cmVzTGF5ZXIiLCJMYXllcnMiLCJjb3ZlcmVkIiwiY2xlYXJEZXB0aCIsImVuYWJsZSIsInNldE1hcCIsImlzTWFwIiwiY2VudGVyWCIsImNlbnRlcloiLCJhcHBseVNldHRpbmdzIiwibWFwU2V0dGluZ3MiLCJtYXAxIiwibWFwMiIsIm9yZGluYWwiLCJSSUdIVENMSUNLIiwibG9hZE1hcHMiLCJsb2FkU2V0dGluZ3MiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQUFBOzs7OztLQU9hQSxhQUFhLEdBQUcsU0FBaEJBLGFBQWdCLENBQUFDLE1BQU0sRUFBSTtDQUNuQyxNQUFJQyxLQUFLLEdBQUdDLFFBQVEsQ0FBQ0MsZUFBVCxDQUF5Qiw4QkFBekIsRUFBeUQsS0FBekQsQ0FBWjtDQUNBRixFQUFBQSxLQUFLLENBQUNHLEdBQU4sR0FBWUosTUFBWjtDQUNBLFNBQU9DLEtBQVA7Q0FDSDtDQUVEOzs7Ozs7O0tBTWFJLGNBQWMsR0FBRyxTQUFqQkEsY0FBaUIsQ0FBQ0MsQ0FBRCxFQUFJQyxDQUFKLEVBQVU7Q0FDcEMsTUFBSUMsSUFBSSxHQUFHLEdBQVg7Q0FDQUEsRUFBQUEsSUFBSSxJQUFJQyxpQkFBaUIsQ0FBQ0gsQ0FBRCxDQUF6QjtDQUVBRSxFQUFBQSxJQUFJLElBQUksR0FBUjtDQUNBQSxFQUFBQSxJQUFJLElBQUlDLGlCQUFpQixDQUFDRixDQUFELENBQXpCO0NBRUFDLEVBQUFBLElBQUksR0FB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